我正在檢查出蛋糕的庫,並在其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)
我的疑惑是以下幾點: -
爲什麼允許逗號到位月份只爲29 & 30?
2.爲什麼它採用X20在正則表達式?在DATE表達式中使用它有什麼需要?
3.是否有任何日期標準/規則/規範我缺少哪些允許使用29 & 30沒有提及月?
任何人都可以幫助理解所有這些背後的邏輯嗎?
難道你看不到'[1,3-9]'中的逗號?這就是逗號匹配的原因。 –
我明白了,但我試圖理解爲什麼cakephp會在第一時間使用逗號,如果其他人必須稍後將其刪除? –
這是一個錯誤。有很多帶有正則表達式的庫,我也看到了這些(和其他)不準確的地方。是很常見。文件中有錯別字(昨天有一些Django問題)。有一些網站說您可以使用'[A-z]'來匹配所有的ASCII字母,但事實上,[它是錯誤的](http://stackoverflow.com/a/29771926/3832970)。 –