Laravel 验证未捕获空格

Whitespace not caught by Laravel validation

我正在尝试验证密码输入字段,但验证器没有捕获到空格。密码字段应至少包含 6 个字符,并且正则表达式应允许密码内有空格,但不能在开头或结尾(我已确认这在验证程序之外有效)。

当用户在密码字段中输入 1 个以上的空格(但没有其他字符)并提交时,验证器无法捕获它(即验证器未捕获到“”)。

这是我的验证器的样子:

$this->validate($request, [
    'name' => 'required|max:255|alpha',
    'password' => 'regex:/^[^\s]+(\s+[^\s]+)*$/|min:6|confirmed',
]);

您的正则表达式有误。在第二个 \s 之后应该是 * 而不是 +。使用以下一个:

/^[^\s]+(\s*[^\s]+)*$/

如果其他规则与正则表达式一起使用并用管道分隔,验证器可能无法工作。所以尝试使用规则数组:

'password' => array('regex:/^[^\s]+(\s*[^\s]+)*$/', 'min:6', 'confirmed')

我在一个测试 laravel 应用程序中用这个进行了测试,它似乎可以工作

'password' => 'required|min:6|confirmed|regex:/^[^\s]+(\s+[^\s]+)*$/',

验证器检查输入是否 isValidatable() by trimming the input,并确定输入是否为空,尽管它为空,但是否仍应验证该输入(即,具有要求、存在等规则的输入被确定为可验证并稍后在验证过程中处理)。

在这种情况下,由于这些 implicit rules 中的 none 包含在字段验证规则中,因此空格输入被确定为不可验证,并且从未达到正则表达式或最小规则。

感谢 jemaclus 的挖掘和发现。

您完全可以忽略使用正则表达式,就像这样

'password'=>[
            'required',
            'min:6',
            function ($attribute, $value, $fail){
                if (strstr($value,' ')) {
                    $fail(__('site.no_whitespaces_allowed_in_password'));
                }
            },
        ],
        'password_confirmation'=>[
            'required',
            'min:6',
            'same:password',
                function ($attribute, $value, $fail){
                if (strstr($value,' ')) {
                    $fail(__('site.no_whitespaces_allowed_in_password_confirmation'));
                }
            },
        ],