我正在查看蛋糕库,并在其Validation.php文件中找到了日期的正则表达式。我对各种日期值使用它,发现它甚至匹配某些特定日期的错误日期值。
例如,它与以下日期完全匹配(实际上,应该):-
20/01/2011
19/09/2017
20/01/1601但是,当我使用错误的日期值( 29和/或30作为日期)时,令人惊讶的是它也匹配它们(哪个不应该是):-
30/,/1601
29/,/2017https://regex101.com/r/8Q96bd/1/
另一件有趣的事情是,如果您更改日期并使用除30和29以外的其他日期,则表达式将与其不匹配。
使用除29和30以外的任何其他日期,但不匹配:-
28/,/1600https://regex101.com/r/UKuPWU/1/
那么,如果cakephp包含30 & 29作为日期,那么为什么cakephp的date regex表达式匹配错误的日期值呢?
这句话是:-
^(?:(?:(?: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目录中找到这个表达式(不过,我使用的是蛋糕2.x )。
\lib\Cake\Utility\Validation.php (check out its date function)

我的疑虑如下:
1.为什么只允许逗号代替月份( 29 & 30? )
2.为什么在正则表达式中使用x20?在日期表达式中使用它有什么需要?
3.是否遗漏了任何日期标准/规则/规范,允许在不提及月份的情况下使用29和30?
有谁能帮助我们理解这些事情背后的逻辑吗?
发布于 2017-06-27 06:35:43
字符类中的逗号对regex引擎有意义。[1,3-9]与1、, (!)、3、4、5、6、7、8和9匹配。
你得去掉那个逗号。
此外,在模式中存在大量的冗余分组,只会阻止模式调试。
下面是正则表达式的一个更清晰的版本:
^(?: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}$请注意,\x20与空格匹配,字符与十进制代码32匹配。使用\x20是为了避免在模式中引入文字空格,以便当您可以向模式添加注释并拆分成单独的行时,可以使用x (自由起搏)修饰符轻松地对其进行调试(参见示例)。
https://stackoverflow.com/questions/44772614
复制相似问题