Re: regulArni vyraz [was: Re: regulerni vyraz]

From: Spock (spock@bfs.cz)
Date: 24. 02. 2001, 15:57 CET


>>V regulernich vyrazech se moc nevyznam a tak bych se rad zeptal,
>>zda se s jejich pomoci da provest (v PHP) nasledujici: Aby byly znaky
>>ktere se v retezci opakuji vice nez 3x (za sebou) nahrazeny pouze
>>3 znaky z teto rady, pr. xxxxxxxxxx -> xxx   ----- -> ---  aaaa -> aaa

>Co napriklad takhle? (neodzkouseno) s/\(.\)\1\{3,}/\1\1\1/g

to je ok, jenze takhle to chodi v perlu, ale ne v php. a na muj vkus ;-))
je tam nejak zbytecne moc backslashs - stacilo by: s/\(.)\1{3,}/\1\1\1/g

ale JDE to i v php. jenom je treba pouzit regex fce pro perlovskou syntaxi
(preg_*), pac phpsky (posix) regexy muzou pouzivat pamatovani jenom
v sibstitucnim stringu. primo v regexu se neuplatni. BACHA - preg_* fce
jsou implementovane az od php verze 3.0.9 !!!!!!!.

ale protoze php holt neni perl a zachazi s regexy trochu jinak, musi se to
cele jeste trochu precesat... :))

$text="ruuuuuuuzovaaaaaaaa";
echo preg_replace("/(.)\\1{3,}/","\\1\\1\\1",$text);
# vypise: ruuuzovaaa

pokud chces ovladat kolik tech vyskytu (zleva) se ma upravit, dej si tam
jeste ctvrty parametr. bude-li to cislo n>0, nahradi se prvnich n vyskytu,
pri n=0 nebo "" nebo false se nenahradi nic a bude-li to -1 nahradi se
vsechny vyskyty:

$kolik="1";
$x=preg_replace("/(.)\\1{3,}/","\\1\\1\\1",$text,$kolik);
echo $x;
# vypise: ruuuzovaaaaaaaa

a jeste jen tak na okraj: jsou to regulArni vyrazy a ne regulErni. to jsou
totiz zcela odlisne pojmy. regulerni je vsechno, co neni neregulerni...
a regulerni nazev techhle sikovnych konstrukci je 'regularni vyrazy'. :))

bye, spock.



This archive was generated by hypermail 2.1.2 : 04. 09. 2001, 05:40 CEST