2017-06-27 7 views
0

Je vérifiais la bibliothèque de gâteau et trouvé une expression régulière pour la date dans son fichier Validation.php. Je l'ai utilisé contre diverses valeurs de date et trouvé qu'il correspond même à des valeurs de date erronées pour certaines dates spécifiques.La date de cakephp expression régulière correspond à la mauvaise date

Par exemple, elle correspond parfaitement contre les dates suivantes (qui, en fait, il devrait): -

20/01/2011 
19/09/2017 
20/01/1601 

Mais quand j'utilise une valeur de date mal avec 29 et/ou 30 comme date, puis étonnamment il leur correspond aussi (qui il ne devrait pas): -

30/,/1601 
29/,/2017 

https://regex101.com/r/8Q96bd/1/

Une autre chose intéressante est, si vous changez la date et utilisez une autre date, sauf 30 et 29, alors l'expression ne correspond pas.

Utilisez toute autre date, sauf 29 & 30 et il ne correspond pas: -

28/,/1600 

https://regex101.com/r/UKuPWU/1/

Alors pourquoi l'expression regex date de la terre CakePHP correspond à une valeur de date incorrecte si elle contient 30 & 29 comme date?

est ici l'expression: -

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

Vous pouvez trouver cette expression dans le répertoire lib CakePHP (je suis en utilisant 2.x gâteau bien).

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

enter image description here

Mes doutes sont suivants: -

1. Pourquoi est-ce qui permet par des virgules en place du mois seulement pour 29 & 30?

2. pourquoi il a utilisé x20 dans l'expression régulière? Quel est le besoin de l'utiliser dans une expression DATE?

3. Y a-t-il une date/règle/spécification qui me manque, ce qui permet d'utiliser 29 & 30 sans mentionner le mois?

Quelqu'un pourrait-il aider à comprendre la logique derrière toutes ces choses?

+0

Ne voyez-vous pas la virgule dans '[1,3-9]'? C'est pourquoi la virgule est appariée. –

+0

Je l'ai compris mais j'essayais de comprendre POURQUOI cakephp utiliserait une virgule en premier lieu si d'autres devaient l'enlever plus tard? –

+1

C'est une erreur. Il y a beaucoup de bibliothèques avec regex, et j'ai vu ces inexactitudes (et d'autres) en eux. Il est courant. Il y a des fautes de frappe dans les documentations (hier, il y avait une question Django). Il y a un site qui dit que vous pouvez utiliser '[A-z]' pour faire correspondre toutes les lettres ASCII, mais en fait, [c'est faux] (http://stackoverflow.com/a/29771926/3832970). –

Répondre

2

La virgule à l'intérieur d'une classe de caractères est significative au moteur regex. [1,3-9] matchs 1, , (!), 3, 4, 5, 6, 7, 8 et 9.

Vous devez supprimer cette virgule. En outre, il existe des charges de regroupements redondants dans le canevas qui empêchent uniquement le débogage du canevas.

Voici une version plus propre de l'expression rationnelle:

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

Voir la regex demo

Notez que \x20 correspond à un espace, l'omble chevalier avec le code décimal 32. \x20 est utilisé afin de ne pas introduire une espace blanc littéral dans le motif afin qu'il puisse être facilement débogué avec le modificateur x (freespacing) lorsque vous pouvez ajouter des commentaires au motif et diviser en lignes séparées (voir example).