Autor | Zpráva | ||
---|---|---|---|
caradoc Profil * |
#1 · Zasláno: 15. 9. 2013, 19:10:53
Dobrý den
prosím o pomoc, potřebuji v PHP ověřit formát čísla který může být ve formátu 0.000000 až 999.999999 takže před desetinnou čárkou ověřit jednu až tří číslovky a za des.čárkou ověřit 0-6 číslovek, pomůže na toto funkce preg_match a jak nejefektivněji sestavit regulární výraz?? děkuji za pomoc, Caradoc |
||
Sir Tom Profil |
caradoc:
Také dobrý den, třebas preg_match('/^\d{1,3}\.?\d{0,6}$/', $data);
|
||
caradoc Profil * |
#3 · Zasláno: 15. 9. 2013, 20:27:03
[#2] Sir Tom
to je přesně ono, děkuji za pomoc, |
||
juriad Profil |
#4 · Zasláno: 15. 9. 2013, 20:33:04
caradoc:
Není, vyhovuje třeba i číslo 11111; pokud má být tečka nepovinná, je lepší: '/^\\d{1,3}(\\.\\d{0,6})?$/' A samozřejmé, je třeba zdvojit lomítka a nevyužívat té nestandardní "vlastnosti" PHP. |
||
Sir Tom Profil |
#5 · Zasláno: 15. 9. 2013, 21:09:15
juriad:
„je třeba zdvojit lomítka a nevyužívat té nestandardní "vlastnosti" PHP“ O jakou nestandardní vlastnost se jedná? BTW - jj - tvé řešení je lepší, ale projde i "111.", což (si myslím) není žádoucí (navzdory zadání). Místo {0,6} bych napsal {1,6}. |
||
juriad Profil |
#6 · Zasláno: 15. 9. 2013, 21:35:11
Sir Tom:
Jen to, že mezi jednotlivými programovacími jazyky není consensus ohledně způsobu, jak se má chovat zápis řetězce, který obsahuje zpětné lomítko, které není součástí escape sekvence. V některých jazycích to skončí chybou, v jiných se zpětné lomítko tiše zahodí, v jiných (sem patří PHP) se takové lomítko vypíše. Samozřejmě, že v PHP je to správně, nicméně i tak to může být matoucí, protože takový zápis vyžaduje znalost dalšího pravidla. Jedná se o stejný problém jako třeba s modulením záporného čísla: -3 % 2 = 1 nebo -1
|
||
Alphard Profil |
#7 · Zasláno: 15. 9. 2013, 21:39:08
Sir Tom:
PHP nevyžaduje (otrocké) escapování, pokud nejde o zvláštní znaky (což \d v kontextu PHP není). Ale v jednoduchých apostrofech se sekvence nenahrazují vůbec, takže také nechápu.
Celkově je to řešení pro uživatele tyranské. Když zadá víc desetinných míst, nemůže se to automaticky zaokrouhlit? Když zadá , místo ., nemůže se to nahradit? Když dá na kraj bílý znak, nemůže se smazat? Provedl bych nějaké replace a pak zkontrolovat povolený rozsah. |
||
juriad Profil |
Alphard:
Uznávám, že v jednoduchých apostrofech se téměř chyba nedá udělat. Nicméně, pokud je třeba v regulárním výrazu znaku zpětné lomítko, je ho vždy nutné zapsat jako čtyři zpětná lomítka v zápisu řetězce (je jedno v jakých uvozovkách). '/\\\\*/' # vyhoví jen řetězec složený ze zpětných lomítek Já osobně \\ a \' považuji za escape sekvence. Ačkoli se jich v apostrofech vyhodnocuje mnohem méně, pořád tam existují.
Jde o můj osobní názor, který je (alespoň si to myslím) konzistentní a pro programátora, který často přesedá mezi několika jazyky, docela bezpečný. Souhlasím s tvým názorem, že by bylo vhodnější vstup ořezat, převést na číslo a zaokrohlit. |
||
Sir Tom Profil |
#9 · Zasláno: 15. 9. 2013, 22:36:44 · Upravil/a: Sir Tom
Alphard:
juriadovo a moje řešení se drží striktního zadání. Zcela souhlasím, že lepší by bylo místo desetinné tečky povolit i desetinnou čárku a dále pak nijak neomezovat počet cifer za tečkou (čárkou). Co se týká zaokrouhlení - záleží na situaci. Podle zadání nedokáži rozhodnout. juriad: „stejný problém jako třeba s modulením záporného čísla: -3 % 2 = 1 nebo -1“ S tím modulením záp. čísla jsem to již někde slyšel nebo četl. Pátrám nyní v paměti, zda-li jsem někdy použil modulo u záporného čísla. Moc nenapadá mně žádné použití - možná v kryptografii. |
||
juriad Profil |
#10 · Zasláno: 16. 9. 2013, 12:07:33
Sir Tom:
Třeba v C++: http://stackoverflow.com/questions/7594508/modulo-operator-with-negative-values Souhlasím s tím, že se to nejspíš nikdy nepoužije; dokud uživatel někam nevloží zápornou hodnotu a výsledek modula nevyjde záporně a on to měl být třeba index do pole. Koukám, že v přikladu se čtyřmi lomítky mám nedokonalost, stačily by tři; lepší ukázka je: '/\\\\\'/' # zpětné lomítko následované apostrofem |
||
Časová prodleva: 11 let
|
0