【问题标题】:Laravel date validation failing to require 4 digit yearLaravel 日期验证不需要 4 位数年份
【发布时间】:2014-10-25 22:19:52
【问题描述】:

我对 Laravel 日期验证获得的结果感到有些困惑。有问题的规则是:

'date_of_birth'=>array('required', 'date_format:n/j/Y')

我发现如果有人输入 10/12/13,它会通过验证,并存储为 10/12/0013。显然,这并不好。有什么方法可以验证要求四位数的年份吗?我认为这就是格式中的 Y 会做的事情。

【问题讨论】:

  • 我可以重现这个(Laravel 4.2.11,PHP 5.5)。正如this question 中所讨论的,这似乎是一个 PHP(不是 Laravel)特定的错误。但你可以解决它:array('required', 'date_format:n/j/Y', 'regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/')
  • 该死,我尝试搜索有关该主题的其他问题,但没有出现。我不知道正则表达式,所以作为部分修复,我添加了 `after:01-01-1900',它会捕获这个错误和各种胖手指。不过,您的答案是正确的。如果您想将其添加为单独的回复,我很乐意将您标记为正确。

标签: validation date laravel-4


【解决方案1】:

发表我的评论作为答案

注意:这与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/9999”这样的日期仍然会过去。

不是您的after:01-01-1900 解决方法的情况。所以,即使它没有按预期使用,我仍然会选择

'date_of_birth'=>array('required', 'date_format:"n/j/Y"', 'after:01-01-1900')

(或者可能稍微调整一下正则表达式...)。

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

DateTime::createFromFormat('n/j/Y', '99/99/9999');

给我一​​个日期“10007-06-07”,实际上应该在“01-01-1900”之后,但验证器失败 - 可能是因为比较了两个日期,也可能是因为无效值.我不知道它是如何计算的。这是一些不可预测的行为,因此请谨慎处理:)

如果它很愚蠢但有效,那么它并不愚蠢。 - 墨菲定律

【讨论】:

  • 真的是“bug”吗? 公元 13 年。
  • @ceejayoz 当然可以,但是您将 Y 传递给表示您希望以 4 位数字显示年份的函数。这不是关于年份是否有效,而是关于它是如何传递/显示的,验证器应该确保你传递 13 AD 作为 0013 而不仅仅是 13。
  • 谢谢,非常有帮助的回复,以及对正则表达式的很好解释。
  • 一年半后回到这个问题,我想我会补充一点,将正则表达式中的 {2} 更改为 {1,2} 将允许 1 或 2 位数的日期和月份便于数据输入的值。 4 位数的年份是最重要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2015-01-06
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
相关资源
最近更新 更多