首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cakephp的日期正则表达式匹配错误的日期

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

Stack Overflow用户
提问于 2017-06-27 05:07:56
回答 1查看 35关注 0票数 0

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

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

代码语言:javascript
复制
20/01/2011
19/09/2017
20/01/1601

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

代码语言:javascript
复制
30/,/1601
29/,/2017

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

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

使用除29和30以外的任何其他日期,但不匹配:-

代码语言:javascript
复制
28/,/1600

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

那么,如果cakephp包含30 & 29作为日期,那么为什么cakephp的date regex表达式匹配错误的日期值呢?

这句话是:-

代码语言:javascript
复制
^(?:(?:(?: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 )。

代码语言:javascript
复制
\lib\Cake\Utility\Validation.php  (check out its date function)

我的疑虑如下:

1.为什么只允许逗号代替月份( 29 & 30? )

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

3.是否遗漏了任何日期标准/规则/规范,允许在不提及月份的情况下使用29和30?

有谁能帮助我们理解这些事情背后的逻辑吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-27 06:35:43

字符类中的逗号对regex引擎有意义。[1,3-9]1, (!)、3456789匹配。

你得去掉那个逗号。

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

下面是正则表达式的一个更清晰的版本:

代码语言:javascript
复制
^(?: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演示

请注意,\x20与空格匹配,字符与十进制代码32匹配。使用\x20是为了避免在模式中引入文字空格,以便当您可以向模式添加注释并拆分成单独的行时,可以使用x (自由起搏)修饰符轻松地对其进行调试(参见示例)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44772614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档