Reg exp pro datum ne a ne fungovat
- Martin Mates
- Člen | 179
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
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
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
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
Opakovanie priestupných rokov má presne dané pravidlá, teda do regulárneho výrazu sa kompletná kontrola dátumu dá 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).