Zadejte hledaný výraz...

Regulerní výraz pro validaci času v PHP ve formátu HH:MM

franta.hosek
verified
rating uzivatele
31. 5. 2023 10:32:55
Ahoj,
narazil jsem na problém s doporučenými funkcemi pro validaci času ve formátu HH:MM. Na fóru mají tyhle příklady desítky lajků a zpráv, že to funguje. Mně však nefunguje ani jeden typ výrazu. Mohli byste mi prosím poradit proč?
Co potřebuji? Min. přípustný čas 00:01 a max. 23:59. Chci to vždy na pět znaků. Tzn. nechci mít něco jako 5:7, ale chci mít 05:07
$time = "34:84";
$validate1 = preg_match('/(2|):/', $time);
$validate2 = preg_match('/(?|2):?/', $time);
$validate3 = preg_match('/:/', $time);
if ($validate1 === FALSE)
{
echo 'n1';
}
if ($validate2 === FALSE)
{
echo 'n2';
}
if ($validate3 === FALSE)
{
echo 'n3';
}
echo 'y';
31. 5. 2023 10:32:55
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517356
skorozacatecnik
verified
rating uzivatele
31. 5. 2023 12:25:28
Uvedený regexp nemá definovaný začátek a konec řetězce, takže bude validní vše, co bude obsahovat čas a před/za ním cokoliv dalšího.
Omezení začátku a konce se definuje pomocí ^ a $, takže by mohlo pomoci toto:
31. 5. 2023 12:25:28
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517355
TomasX
verified
rating uzivatele
(4 hodnocení)
31. 5. 2023 12:35:33
podle mě ani jeden z těch regulárů nedělá co popisuješ, že by měl, nejblíže je první, který ale bere i 00:00, což jde opravit poměrně snadno:
Druhý dovoluje mít i zkrácené varianty (ten otazník říká, že to je nepovinná pozice) a také bere 00:00 a ten třetí ti klidně vezme nevalidní čas jako je třeba 29:00 a také vezme 00:00.
31. 5. 2023 12:35:33
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517354
TomasX
verified
rating uzivatele
(4 hodnocení)
31. 5. 2023 12:37:12
Napsal skorozacatecnik;1663503
Uvedený regexp nemá definovaný začátek a konec řetězce, takže bude validní vše, co bude obsahovat čas a před/za ním cokoliv dalšího.
Omezení začátku a konce se definuje pomocí ^ a $, takže by mohlo pomoci toto:
to je dobrá poznámka, ale zásadní problém bych viděl v tom, že to bere 00:00, což by neměl být přípustný stav
31. 5. 2023 12:37:12
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517353
skorozacatecnik
verified
rating uzivatele
31. 5. 2023 12:54:11
Napsal TomášX;1663506
to je dobrá poznámka, ale zásadní problém bych viděl v tom, že to bere 00:00, což by neměl být přípustný stav
Všiml jsem si, že franta.hosek psal minimální přípustný čas, ale ono 00:00 prostě existuje, tak jsem to 01 ani neřešil. Ale pokud to franta chce od 01, tak to je relevantní připomínka, to pak ten regexp není korektní.
31. 5. 2023 12:54:11
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517352
TomasX
verified
rating uzivatele
(4 hodnocení)
31. 5. 2023 14:25:07
není to první požadavek na 00:01 až 23:59 co vidím, nejspíš za vše může to, že nikdo (vývojář vs zadavatel vs zákazník) vlastně přesně neví k jakému dni se to 00:00 vztahuje a všichni si to pletou, což je asi legitimní připomínka, někdo to řeší tím, že má rozsah 00:01 až 24:00 (např. tak jsme to dělali v ČD v novém ticketovacím systému), někdo zase to raději uvádí jako 00:01 až 23:59, protože pak to je jednoznačné a já osobně mám asi nejraději variantu opisnou, tj. uvést datum bez času a třeba přidat dovětek, že to je celý den.
Jestli to franta.hosek tak píše záměrně nebo jako chybu, kdo ví, to musím napsat, zdůvodnit a obhájit si sám sobě nebo to sem upřesnit.
31. 5. 2023 14:25:07
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517351
MatesM
verified
rating uzivatele
31. 5. 2023 18:38:17
Ještě si dát pozor na to jak v tom příkladu porovnává výsledek (řeší pouze false). Tedy jaké jsou návratové hodnoty té funkce preg_match viz dokumentace
preg_match() returns 1 if the pattern matches given subject, 0 if it does not, or false on failure.
31. 5. 2023 18:38:17
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517350
TomasX
verified
rating uzivatele
(4 hodnocení)
31. 5. 2023 18:49:49
pravda, mělo by být $validate1 == FALSE
31. 5. 2023 18:49:49
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517349
MatesM
verified
rating uzivatele
31. 5. 2023 20:39:33
Anebo klidně si to ještě trošku otočit na
A má správně pořešeny oba případy když to nenajde nebo to vrátí false.
31. 5. 2023 20:39:33
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517348
Jiri Uhlir
verified
rating uzivatele
1. 6. 2023 08:51:22
Kód:
Toto vrátí:
11:24 1
00:00 0
00:01 1
15:00 1
24:00 0
26:00 0
23:59 1
Takže by mělo splňovat požadavky. Samozřejmě také hlídá, aby nebylo "5:7", ale "05:07" jako validní.
1. 6. 2023 08:51:22
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517347
TomasX
verified
rating uzivatele
(4 hodnocení)
1. 6. 2023 08:58:17
proč tak složitě? Není čitelnější nechat tu původní variantu s drobnou úpravou?
1. 6. 2023 08:58:17
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517346
TomasX
verified
rating uzivatele
(4 hodnocení)
1. 6. 2023 09:00:08
Napsal MatesM;1663526
Anebo klidně si to ještě trošku otočit na
A má správně pořešeny oba případy když to nenajde nebo to vrátí false.
to vychází v prostředí php shodně, ne? 0 i false == false, i testy v php sources počítají pouze s false
1. 6. 2023 09:00:08
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517345
MatesM
verified
rating uzivatele
1. 6. 2023 10:08:38
Napsal TomášX;1663539
to vychází v prostředí php shodně, ne? 0 i false == false, i testy v php sources počítají pouze s false
To ano, ale záleží zda nemá třeba vyžadováno aby měl všude použito striktní porovnání. Nebo teď tam měl pouze == false a poté si někdo řekne proč když porovnává false tam nedá striktní porovnání upraví a bude to fungovat jinak než by člověk očekával.
1. 6. 2023 10:08:38
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517344
Jiri Uhlir
verified
rating uzivatele
1. 6. 2023 10:51:20
Napsal TomášX;1663538
proč tak složitě? Není čitelnější nechat tu původní variantu s drobnou úpravou?
To je asi otázka názoru. Mně to takto přijde čitelné, originální kód to změní v čitelnosti velice výrazně a splňuje to kompletně zadání, aniž by se muselo dál cokoli dít (resp. po tomto regexu nejsou třeba další podmínky). Vzhledem k tomu, že jsou v něm přímo vypsány varianty, tak už od pohledu je jasné, co má dělat, případně stačí komentář v kódu.
1. 6. 2023 10:51:20
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517343
TomasX
verified
rating uzivatele
(4 hodnocení)
1. 6. 2023 11:51:35
Napsal Jiří Uhlíř;1663544
To je asi otázka názoru. Mně to takto přijde čitelné, originální kód to změní v čitelnosti velice výrazně a splňuje to kompletně zadání, aniž by se muselo dál cokoli dít (resp. po tomto regexu nejsou třeba další podmínky). Vzhledem k tomu, že jsou v něm přímo vypsány varianty, tak už od pohledu je jasné, co má dělat, případně stačí komentář v kódu.
Osobně tenhle regulár očima projdu daleko rychleji a připadá mi jasnější, také plně splňuje zadání, je z toho na první pohled jasné, kterou variantu vylučuji z obecné definice reguláru pro čas:
/^(?!00:00)(2|):$/
Není pak potřeba konvergovat všechny varianty postupně.
Ale máš pravdu, je to minoritmí problém a velice subjektivní. V PHP nedělám, takže netuším, která varianta je pro php prostředí přirozenější.
1. 6. 2023 11:51:35
https://webtrh.cz/diskuse/regulerni-vyraz-pro-validaci-casu-v-php-ve-formatu-hhmm#reply1517342
Pro odpověď se přihlašte.
Přihlásit