Reg exp pro datum ne a ne fungovat

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Martin Mates
Člen | 179
+
0
-

Zdravím. Peru se tu s reg. výrazem pro datum ve formuláři:

<?php
->addRule(Form::REGEXP, 'Nesprávný formát data, musí být dd.mm.yyyy .', '/(0[1-9]|[12][0-9]|3[01])[/.](0[1-9]|1[012])[/.](19|20)[0-9]{2}/')
?>

Nechápu proč to nejde, zkoušel jsem toho už mraky a nikdy to nefunguje jak má. Tohle nespolkne datum ‚08.04.2009‘. Už jsem celkem zoufalý. Má to být javascriptový reg.exp nebo PHPkový? Myslím, že v tom je nějaký rozdíl. Je ten regulární výraz správně?

Díky

Martin Mates
Člen | 179
+
0
-

Objevil jsem tam chybku.. ted je to:

<?php
->addRule(Form::REGEXP, 'Nesprávný formát data, musí být dd.mm.yyyy .', '/(0[1-9]|[12][0-9]|3[01])[\.](0[1-9]|1[012])[\.](19|20)[0-9]{2}/')
?>

Uz to celkem funguje. Ale ted to spolkne datum ‚08.01.200933‘. Jeste bude asi nekde chybka.

kravčo
Člen | 721
+
0
-

Pred časom som jeden taký výraz písal.

Chybka, o ktorej píšeš, je v tom, že nevynucuješ zhodu s celým dátumom, ale len jeho časťou – treba pridať značky začiatku & konca reťazca:

'/^(0[1-9]|[12][0-9]|3[01])[\.](0[1-9]|1[012])[\.](19|20)[0-9]{2}$/'

Navyše tvoj regulár akceptuje aj neplatné dátumy ako napr. '30.02.1988', preto je lepšie na tejto úrovni riešiť preklepy a vlastnou validáciou (napr. funkciou checkdate()) overovať platnosť dátumu.

_Martin_
Generous Backer | 679
+
0
-

Já mám též takový hezký výraz – při pohledu na tvé dílo si nejsem jistý, zda není zbytečně složitý. Co myslíte?

/^((0?[1-9]|[1-2][0-9])\. ?(0?2)\. ?|(0?[1-9]|[1-2][0-9]|30)\. ?(0?[469]|11)\. ?|(0?[1-9]|[1-2][0-9]|3[01])\. ?(0?[13578]|10|12)\. ?)([0-9]{4})$/

Pozn. ovšem validaci na správnost data (typu 29.2.2009) se stejně nevyhnu

kravčo
Člen | 721
+
0
-

Opakovanie priestupných rokov má presne dané pravidlá, teda do regulárneho výrazu sa kompletná kontrola dátumu narvať. Otázkou je, či je to dobré… Myslím si, že je dobré používateľovi oznámiť, či je chyba v zápise, alebo v nezmyselnosti správne zapísaného dátumu.

Moj kandidát:

/^\d{1,2}\s*\.\s*\d{1,2}\s*\.\s*(?:\d{2}|\d{4})$/

Ešte pripojím užitočný výtvor (neviem ako funguje pod aktuálnou revíziou Nette).