我的应用程序由于存储在数据库中的字符串而出现错误,这些字符串的中间有两个空格并且没有适当地修剪。
在我的控制器中,我使用了laravel的验证程序,我相信该验证程序使用trimStrings中间件来处理输入的内容,但是我的代码仍在数据库中存储带双倍空格的字符串。
这是我的控制器代码:
public function update(Request $request, $id)
{
$room = Room::find($request->roomid);
$data = $this->validate($request, [
'name' =>'required|string',
'volume' => 'required',
'newrefurb'=> 'required'
]);
$updateroom = $room->updateRoom($data);
}
这是我的模型代码:
public function updateRoom($data)
{
$this->name = $data['name'];
$this->volume = $data['volume'];
$this->newrefurb = $data['newrefurb'];
$this->save();
return $this->id;
}
在这里,名称字段是字符串中间包含双空格的问题。
处理双倍间距字符串的正确方法是什么?
答案 0 :(得分:0)
TrimStrings
中间件从字符串的开头或结尾(而不是中间)修剪空格。您可以在这里创建一个帮助程序,并使用它来修剪字符串中任何地方的多余空格:
function trimExtraSpaces($text)
{
return preg_replace('/\s+/', ' ', $text);
}
-编辑
如下面的注释中所建议的那样,为了存储它而没有多余的空间,您可以对列进行更改,因此在模型中,请输入以下内容:
public function setNameAttribute($value)
{
$this->attributes['name'] = trimExtraSpaces($value);
}
答案 1 :(得分:0)
如@nakov的答案中所述,这是因为TrimStrings
仅使用php的trim()函数,该函数只会从字符串的开头和结尾去除空格。
如果您希望TrimStrings
中间件也用单个空格替换所有双精度空格,则可以向TrimStrings
中间件添加以下方法:
/**
* Transform the given value.
*
* @param string $key
* @param mixed $value
* @return mixed
*/
protected function transform($key, $value)
{
if (in_array($key, $this->except, true) || !is_string($value)) {
return $value;
}
return trim(str_replace(' ', ' ', $value));
}