【问题标题】:Whitespace not caught by Laravel validationLaravel 验证未捕获空格
【发布时间】:2017-01-08 13:33:41
【问题描述】:

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

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

这是我的验证器的样子:

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

【问题讨论】:

    标签: php laravel validation laravel-5 laravelcollective


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢安德烈的帮助。我不是正则表达式大师(只是从另一个问题中获取了我使用的正则表达式),但是您和我的似乎都在做同样的事情(无论哪种方式,验证器仍然没有捕捉到空格并引发错误)。
    • @DanielRHarris 什么字符串没有通过验证?
    • 问题在于它正在通过验证:“”(即所有空格)
    • 没有变化,仍然允许所有空格。
    • 你能从控制器发布整个动作吗? @DanielRHarris
    【解决方案2】:

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

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

    【讨论】:

    • 如果您添加 required 它可以工作(因为验证器似乎会修剪输入,然后 required 因为它是空白的而失败),但这是用于配置文件编辑页面上的密码更新字段,如果他们将其留空,我希望它只是不更新​​他们的密码。 HT jemaclus - 验证器似乎只是忽略了所有空白字符串......所以它甚至没有达到正则表达式或最小值。
    【解决方案3】:

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

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

    感谢 jemaclus 挖掘并发现这一点。

    【讨论】:

      猜你喜欢
      • 2015-08-06
      • 2015-01-18
      • 2015-04-16
      • 2021-04-02
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      相关资源
      最近更新 更多