2017-06-27 71 views
0

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

例如,它完美对下列日期相匹配(事实上,它应该): -

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/

那么,为什么在地球CakePHP的日期正则表达式匹配一个错误的日期值,如果它包含30作为约会?

这里是表达: -

^(?:(?:(?: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) 

enter image description here

我的疑惑是以下几点: -

为什么允许逗号到位月份只为29 & 30?

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

3.是否有任何日期标准/规则/规范我缺少哪些允许使用29 & 30没有提及月?

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

+0

难道你看不到'[1,3-9]'中的逗号?这就是逗号匹配的原因。 –

+0

我明白了,但我试图理解为什么cakephp会在第一时间使用逗号,如果其他人必须稍后将其删除? –

+1

这是一个错误。有很多带有正则表达式的库,我也看到了这些(和其他)不准确的地方。是很常见。文件中有错别字(昨天有一些Django问题)。有一些网站说您可以使用'[A-z]'来匹配所有的ASCII字母,但事实上,[它是错误的](http://stackoverflow.com/a/29771926/3832970)。 –

回答

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为了不引入用于匹配将文本空白插入到模式中,以便可以在为模式添加注释并分成单独的行(请参阅example)时使用x(freespacing)修改器轻松调试它。