cakephp的日期正则表达式匹配错误的日期

时间:2017-06-27 05:07:56

标签: php regex cakephp cakephp-2.0 pcre

我正在查看cake的库,并在其Validation.php文件中找到了日期的正则表达式。我将它用于各种日期值,发现它甚至匹配某些特定日期的错误日期值。

例如,它与以下日期完全匹配(事实上,它应该): -

20/01/2011
19/09/2017
20/01/1601

但是当我使用错误的日期值29和/或30作为日期时,令人惊讶的是它也匹配它们(它不应该): -

30/,/1601
29/,/2017

https://regex101.com/r/8Q96bd/1/

另一个有趣的事情是,如果您更改日期并使用除30和29之外的其他日期,那么表达式将不匹配。

使用除29&之外的任何其他日期。 30它并不匹配: -

28/,/1600

https://regex101.com/r/UKuPWU/1/

那么为什么在地球上蛋糕的日期正则表达式匹配错误的日期值,如果它包含30& 29作为约会?

这是表达式: -

^(?:(?:(?:31(\\\/|-|\\.|\\x20))(?:0?[13578]|1[02]))\1|(?:(?:29|30)([-\/])(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29([-\/])0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])([-\/])(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

你可以在cakephp lib目录中找到这个表达式(我正在使用cake 2.x)。

\lib\Cake\Utility\Validation.php  (check out its date function)

enter image description here

我的疑虑如下: -

1。为什么它只允许逗号代替月份仅适用于29& 30吗

2. 为什么它在正则表达式中使用了 x20 ?在DATE表达式中使用它有什么需要?

3。我是否缺少日期标准/规则/规格,允许29& 30,不提月份使用?

有人可以帮助理解所有这些事情背后的逻辑吗?

1 个答案:

答案 0 :(得分:2)

字符类中的逗号对于正则表达式引擎是有意义的[1,3-9]匹配1,(!),3456789

您需要删除该逗号。

此外,模式中存在大量冗余分组,仅阻止模式调试。

以下是正则表达式的更简洁版本:

^(?:31([-\/.\x20])(?:0?[13578]|1[02])\1|(?:29|30)([-\/])(?:0?[13-9]|1[0-2])\2)(?:1[6-9]|[2-9]\d)?\d{2}$|^29([-\/])0?2\3(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)$|^(?:0?[1-9]|1\d|2[0-8])([-\/])(?:0?[1-9]|1[0-2])\4(?:1[6-9]|[2-9]\d)?\d{2}$

请参阅regex demo

请注意,\x20匹配空格,带有十进制代码32的字符。\x20用于不向模式中引入文字空格,以便可以使用{{轻松调试它1}}(freespacing)修饰符,当您可以向模式添加注释并分成单独的行时(请参阅example)。