在我的注册表单中,我有一个昵称字段,用户可以在其中输入文本以在我的网站上识别自己。过去,一些用户输入了其他人可能会觉得冒犯的昵称。Laravel 为表单提供验证功能,但我如何确保表单字段不包含用户可能会觉得冒犯的词?
问问题
13108 次
2 回答
13
虽然 Laravel 包含了广泛的验证规则,但检查给定列表中的单词是否存在并不是其中之一:
http://laravel.com/docs/validation#available-validation-rules
然而,Laravel 也允许我们创建自己的自定义验证规则:
http://laravel.com/docs/validation#custom-validation-rules
我们可以使用以下方法创建验证规则Validator::extend()
:
Validator::extend('not_contains', function($attribute, $value, $parameters)
{
// Banned words
$words = array('a***', 'f***', 's***');
foreach ($words as $word)
{
if (stripos($value, $word) !== false) return false;
}
return true;
});
上面的代码定义了一个名为的验证规则not_contains
- 它在字段值中查找每个单词的存在,$words
如果找到则返回 false。否则返回 true 表示验证通过。
然后我们可以正常使用我们的规则:
$rules = array(
'nickname' => 'required|not_contains',
);
$messages = array(
'not_contains' => 'The :attribute must not contain banned words',
);
$validator = Validator::make(Input::all(), $rules, $messages);
if ($validator->fails())
{
return Redirect::to('register')->withErrors($validator);
}
于 2013-08-06T12:48:09.343 回答
1
在 Laravel 5.7 和可能更早的版本中,您可以使用内置not_regex
规则来检查某些字符串。像这样,例如,在控制器中使用该validate
方法。验证需要狗名的表单输入。:
...
public function update(Request $request) {
$custom_validation_messages = [
'not_regex' => "C'mon! Be original. Give your dog a more interesting name!"
];
$this->validate($request, [
'pet_name' => [ 'not_regex:/^(fido|max|bingo)$/i' ],
], $custom_validation_messages);
...
}
在这种情况下,如果提交的'pet_name'
值为:
- 菲多
- FIDO
- 最大限度
- 最大限度
- 答对了
- 答对了
- 等等
然后验证将失败。
与此相反,即您只想要 Fido、Max 或 Bingo,那么您可以使用如下regex
规则:
[ 'regex:/^(fido|max|bingo)$/i' ]
于 2019-03-15T20:28:43.353 回答