2017-06-27 105 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)修改器輕鬆調試它。