Validation Laravel日期验证不需要4位数年份

Validation Laravel日期验证不需要4位数年份,validation,date,laravel-4,Validation,Date,Laravel 4,我有点困惑于从Laravel日期验证中得到的结果。有关规则是: 'date_of_birth'=>array('required', 'date_format:n/j/Y') 我发现,如果有人输入10/12/13,它通过了验证,并存储为10/12/0013。显然,这不好。有没有办法让验证要求四位数的年份?我假设格式中的Y就是这样做的。将我的评论作为答案发布 注意:这与此处的一般性讨论有关。解决方法已发布在上述问题上。中提到了PHP错误。因此,我不认为这是一种解决方案 答案:这似乎是PHP

我有点困惑于从Laravel日期验证中得到的结果。有关规则是:

'date_of_birth'=>array('required', 'date_format:n/j/Y')
我发现,如果有人输入10/12/13,它通过了验证,并存储为10/12/0013。显然,这不好。有没有办法让验证要求四位数的年份?我假设格式中的Y就是这样做的。

将我的评论作为答案发布

注意:这与此处的一般性讨论有关。解决方法已发布在上述问题上。中提到了PHP错误。因此,我不认为这是一种解决方案

答案:这似乎是PHP函数中的一个bug。您可以通过使用正则表达式指定更严格的规则来解决此问题:

array('required', 'date_format:n/j/Y', 'regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/')
如果你不熟悉正则表达式,一开始它可能看起来很复杂,但如果你把它拆开,它只是说:

[0-9]{2}
=后面必须有两个数字,每个数字都在0和9之间

[0-9]{4}
=必须有4个后续数字,每个数字在0和9之间

\/
=必须有斜杠。它被反斜杠漏掉了

但是:就个人而言,我不太喜欢这个解决方案。即使它确保了四位数的年份,像“99/99/9999”这样的日期仍然会过去

这与您的
after:01-01-1900
解决方案的情况不同。所以,即使它没有按预期使用,我还是会使用它

'date_of_birth'=>array('required', 'date_format:"n/j/Y"', 'after:01-01-1900')
(或者可能稍微调整一下正则表达式…)

有一件事需要记住:它是有效的,但我不太清楚为什么。after过滤器上的底层PHP函数是

给我一个日期“10007-06-07”,它实际上应该在“01-01-1900”之后,但验证器失败-可能是因为比较了两个日期,可能是因为无效值。我不知道这是怎么计算出来的。这是有点不可预测的行为,所以要小心处理:)


如果这是愚蠢的,但它的工作,这是不愚蠢的墨菲定律

我可以重现这一点(Laravel 4.2.11,PHP5.5)。如中所述,这似乎是一个特定于PHP(而不是Laravel)的错误。但是你可以解决它:
array('required',date\u格式:n/j/Y',regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/')
Darn,我试着搜索关于这个主题的其他问题,但没有找到。我不知道正则表达式,所以作为一个部分修复,我添加了'after:01-01-1900',这将捕获这个错误和各种各样的FATFingering。不过,你的答案是正确的。如果你想把它作为一个单独的回答添加进来,我很乐意给你打上正确的标记。它真的是“一个bug”吗?有一个公元13年。@ceejayoz当然,但是您将一个
Y
传递给函数,该函数表示您希望以4位数字显示年份。这不是关于年份是否有效,而是关于它是如何通过/显示的,验证器应该确保您通过13 AD as 0013,而不仅仅是13。谢谢,非常有用的响应,以及对regexp的很好的解释。一年半后回到这一点,我想我应该补充一下,将{2}更改为{1,2}在正则表达式中,将允许1或2位数的日和月值,以便于数据输入。4位数的年份是最重要的一年。
DateTime::createFromFormat('n/j/Y', '99/99/9999');