我对从Laravel日期验证得到的结果感到困惑。有问题的规则是:
'date_of_birth'=>array('required', 'date_format:n/j/Y')
我发现的是,如果有人进入10/12/13,它会通过验证,并存储为10/12/0013。显然,这并不好。有没有办法通过验证来要求四位数的年份?我认为格式中的Y会做什么。
答案 0 :(得分:2)
发表评论作为答案
注意:这与this question以及那里的一般性讨论有关。解决方法已在this answer上发布在上述问题上。 this comment中提到了PHP错误。所以我不赞成这个解决方案。
答案:这似乎是PHP函数date_parse_from_format()中的一个错误。您可以通过使用正则表达式指定更严格的规则来解决此问题:
array('required', 'date_format:n/j/Y', 'regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/')
如果你不熟悉正则表达式,那么一开始可能看起来很复杂,但是如果你把它分开,它就会说:
[0-9]{2}
=必须有2个后续数字,每个数字在0到9之间。
[0-9]{4}
=必须有4个后续数字,每个数字在0到9之间。
\/
=必须有斜线。它被反斜杠逃脱了。
但是:就个人而言,我不太喜欢这个解决方案。即使它确保了四位数的年份,也可以使用像99,99/99999这样的日期。仍然会过去。
{<1}}解决方法的情况 。所以,即使它没有按预期使用,我仍然会使用
after:01-01-1900
(或者可能稍微调整一下正则表达式。)。
要记住一件事:它有效,但我不太清楚为什么。后过滤器上的基础PHP函数是DateTime::createFromFormat()。
'date_of_birth'=>array('required', 'date_format:"n/j/Y"', 'after:01-01-1900')
给我一个&#39; 10007-06-07&#39;的日期,实际上应该在&01; 01-01-1900&#39;之后,但验证器失败 - 可能是因为比较两个日期,可能是因为无效的值。我不知道它是如何计算的。这有点不可预测的行为,所以谨慎处理:)
如果它很愚蠢但它有效,那就不傻了。 - 墨菲定律