2017-06-27 13 views
0

cakeのライブラリをチェックしていて、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 & 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})$ 

あなたは(私もケーキ2.xのを使用しています)CakePHPのlibディレクトリ内でこの表現を見つけることができます。

\lib\Cake\Utility\Validation.php (check out its date function) 

enter image description here

私の疑問は、以下のとおりである: -

1.それが唯一の29 コンマの代わりにすることができているのはなぜ?

2.なぜそれが正規表現でX20を使用していましたか? DATE式でそれを使用する必要はありますか?

3. 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}$ 

\x20はスペース、32 \x20を導入していないために使用されている小数点コードと文字と一致していることをregex demo

を参照してください。注:ここでは

は、正規表現のクリーンバージョンです(を参照)、パターンにコメントを追加して別の行に分割すると、x(フリースペース)修飾子を使用して簡単にデバッグできるように、パターンにリテラル空白を挿入します。

関連する問題