cakephp';s日期正则表达式与错误的日期匹配

cakephp';s日期正则表达式与错误的日期匹配,php,regex,cakephp,cakephp-2.0,pcre,Php,Regex,Cakephp,Cakephp 2.0,Pcre,我正在检查cake的库,在Validation.php文件中找到了date的正则表达式。我对各种日期值使用了它,发现它甚至匹配了一些特定日期的错误日期值 例如,它与以下日期完全匹配(事实上,它应该):- 但是,当我使用错误的日期值29和/或30作为日期时,令人惊讶的是,它也与它们匹配(这应该是不匹配的):- 更有趣的是,若您更改日期并使用除30和29之外的其他日期,那个么表达式将不匹配它 使用除29日和30日之外的任何其他日期,但不匹配:- 28/,/1600 那么,如果cakephp的日

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

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

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

更有趣的是,若您更改日期并使用除30和29之外的其他日期,那个么表达式将不匹配它

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

28/,/1600

那么,如果cakephp的日期正则表达式包含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)

我的疑问如下:-

1.为什么只允许在29和30岁时用逗号代替月份

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

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


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

字符类中的逗号对于正则表达式引擎是有意义的<代码>[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
(freespace)修饰符轻松调试(请参阅)

字符类中的逗号对正则表达式引擎有意义<代码>[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
(freespace)修饰符轻松调试(请参阅)

你没有在
[1,3-9]
中看到逗号吗?这就是逗号匹配的原因。我理解这一点,但我试图理解为什么cakephp会在其他人以后必须删除逗号时首先使用逗号?这是一个错误。有很多带有正则表达式的库,我在其中看到过这样(和其他)的错误。这很常见。文档中有打字错误(昨天,有一些Django问题)。有些网站说你可以使用
[A-z]
匹配所有ASCII字母,但事实上,.Ok。感谢您的精彩解释和演示。我会记住的。你没看到
[1,3-9]
中的逗号吗?这就是逗号匹配的原因。我理解这一点,但我试图理解为什么cakephp会在其他人以后必须删除逗号时首先使用逗号?这是一个错误。有很多带有正则表达式的库,我在其中看到过这样(和其他)的错误。这很常见。文档中有打字错误(昨天,有一些Django问题)。有些网站说你可以使用
[A-z]
匹配所有ASCII字母,但事实上,.Ok。感谢您的精彩解释和演示。我会记住的。
\lib\Cake\Utility\Validation.php  (check out its date function)
^(?: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}$