Dejme tomu, že mám reg. výraz:
(ad){2,4}
A následující hodnoty mi fce ereg() vyhodnotí jako dobré, což je IMHO OK:
adad
adadad
adadadad
Ale ona mi vyhodnotí jako dobré i když tam "ad" zadám 5x, 6x, 7x, atd.
adadadadadad
Co dělám špatně?
No, na první (i na druhý) pohled to vypadá nelogicky, leč není tomu tak. AFAIK jde o tzv. "hladovost" regulárních výrazů, kdy se hledá shoda v celém řetězci, ať už je kde je. Aby fungovalo to co píšeš bys musel napsat jako: "^(ad){2,4}$". A nebo to dát do souvislostí:
<?
$text = '';
$str = 'ad';
for ($i = 1; $i <= 10; $i++) {
$text = $text.$str;
if (ereg("A(".$str."){2,4}A", 'A'.$text.'A'))
echo $i.': '.$text.'<br /<';
}
?>
Vezme to:
adad
adadad
adadadad
a dále už samozřejmě ne.
"Hladovost" viz třeba tady: http://tvorba-www.bravepages.com/php/php/azphp600.htm
Nebo zkus použít funkci preg_match, kde lze použít, narozdíl od POSIX tvaru (v ereg...) tvar používaný např. ve VisualBasicu nebo Perlu.
Fakt je, že v mnoha manuálech je to špatně a píše se tam, že regulárnímu výrazu třeba:
a{1,2}
vyhovuje řetězec, který má znak "a" pouze 1x nebo 2x za sebou, a víckrát ne. Což je špatně.
Ovšem i takovej Kosek v "PHP - tvorba interaktivních internetových aplikací" to tam má a pak se nelze divit problémům...
Fajn je to zajímavý na intervalu to je taky, viz.:
http://interval.cz/clanek.asp?article=498
Konkrétně:
Regulárnímu výrazu 'x{5,10}' vyhoví řetězce obsahující 5-10 znaků 'x' zapsaných za sebou.
Vyzkoušíme i kombinaci kulatých a složených závorek. Regulárnímu výrazu '(xb){2,5}' vyhoví takové řetězce, kde se 'xb' opakuje min. 2krát a max. 5krát. Např. ty co obsahují xbxb nebo xbxbxbxb.
Ale díky moc, Petr
<HTML>To neni publikovano spatne ani v knihach ani v manualu...
Jen je to mysleno tak, ze za tim ocekavame dalsi retezec.
eregi("(ad){2,4}[0-9]{1,}", "adadadadadad2584564");
uz nepojede...
chceme prece aby retezec obsahoval 2x nebo 4x "ad" a pak nedefinujeme nic takze je to RE uz jedno.. 6x jako 4x .. musis pouzit alespon (ad){2,4}$</HTML>
To Richard: Když je to myšleno tak, tak to tam má bejt napsaný. Křišťálový koule (nejen) začátečníci jaksi nevedou...
Víte o tom, že telefon na záchranku je 55?
Jak to, nikam jsem se tím nedovolal?
Co? Tys točil 55? Přece 155, vole!
He?
Mimoto p. Kosek to píše naprosto jasně, cituji:
"Výrazu x{2,10} vyhoví řetězce, které obsahují 2-10 znaků x zapsaných těsně za sebou."
Sorry, ale výraz je výraz, ne část výrazu...
Když se to vyřeší "^" na začátku, a $olarem na konci, tak už mi to je taky f u c k, ale stejně.
<HTML>"Výrazu x{2,10} vyhoví řetězce, které obsahují 2-10 znaků x zapsaných těsně za sebou."
ano presne tak... ale 11x "x" za sebou prece znamena ze tam je i 10x stejne jako treba 5x tudis je to true ... nic vic vyraz hodnotit prece nemusi a nesmi protoze mu to neni zadano... kdyz pouzijes $ a tim mu reknes dal uz nic byt nesmi pak by to byl opravdu bug na nejake strane
takze strucne..
x{2,10} znamena "x" 2x - 10x a za tim muze byt naprosto cokoliv, treba 100x "x" pokud neni definovano jinak, protoze v takovem pripade bez dalsich vyhledavani v retezci nema udaj o maximalnim poctu daneho retezce zadny vyznam</HTML>
V tom případě se lišíme v tom, co znamená slůvko "maximálně" nebo "až".
Ale to je jedno. I na tomto se, stejně jako třeba na "Kosek kontra XHTML", dá založit flamewar.
1) Komu se bude zdát, že regulární výraz nechodí podle toho, jak určitý meta znaky nebo chování regexp pochopil, zeptá se, nebo na to přijde.
2) Komu vyhovuje (což je nejdůležitější) používat XHTML, ať používá XHTML, komu vyhovuje HTML, ať používá HTML.