Autor Zpráva
caradoc
Profil *
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 *
[#2] Sir Tom
to je přesně ono, děkuji za pomoc,
juriad
Profil
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
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
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
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
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
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: