Omejitev pohlepa v regularnih izrazih v PHP
Regularni izrazi so privzeto pohlepni. To pomeni, da zajamejo največje možno število znakov.
Poglejmo si primer. Recimo, da imamo takšno vrstico:
<?php
$str = 'aeeex zzz x kkk';
?>
Recimo, da želimo v tej vrstici najti podniz
'aeeex' po naslednjem vzorcu: črka
'a', nato kateri koli znak enkrat ali večkrat,
nato črka 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Pričakujemo, da se bo v spremenljivko kot rezultat
zapisal niz '! zzz x kkk'. Vendar
ni tako - v spremenljivko pride niz
'! kkk'.
Bistvo je v tem, da naš regularni izraz išče vse
znake od črke 'a' do črke 'x'.
Toda v našem nizu sta dve črki 'x'. Zaradi
pohlepa se izkaže, da regularni izraz išče do
zadnjega 'x', s čimer zajame
nekaj drugega, kot smo pričakovali.
Seveda je takšno vedenje pogosto tisto, kar potrebujemo. Toda ravno v tem primeru bi želeli preklicati pohlep in reči regularnemu izrazu, naj išče do prvega 'x'.
Za omejitev pohlepa morate za operatorjem ponavljanja postaviti vprašaj:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Pohlep je mogoče omejiti vsem operatorjem
ponavljanja, takole: *?, ??
in {}?.
Podan je niz:
<?php
$str = 'aba accca azzza wwwwa';
?>
Napišite regularni izraz, ki bo našel vse nize,
na whose robovih so črke 'a',
in jih zamenjaj s '!'. Med
črkama a je lahko kateri koli znak (razen
'a').