Obmedzenie chamtivosti v regulárnych výrazoch v PHP
Regulárne výrazy sú predvolene chamtivé. To znamená, že zachytávajú maximálne možný počet znakov.
Poďme si to rozobrať na príklade. Nech máme takýto reťazec:
<?php
$str = 'aeeex zzz x kkk';
?>
Nech chceme v tomto reťazci nájsť podreťazec
'aeeex' podľa nasledujúceho vzoru: písmeno
'a', potom ľubovoľný znak jeden alebo viac
krát, potom písmeno 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Očakávame, že do premennej sa ako výsledok
zapíše reťazec '! zzz x kkk'. Avšak,
nie je to tak - do premennej sa dostane reťazec
'! kkk'.
Celé je to o tom, že náš regulárny výraz hľadá všetky
znaky od písmena 'a' až po písmeno 'x'.
Ale v našom reťazci sú dve písmená 'x'. Kvôli
chamtivosti sa stáva, že regulárny výraz hľadá až
po posledné písmeno x, čím zachytáva
nie to, čo sme očakávali.
Samozrejme, často je toto správanie práve to, čo potrebujeme. Ale konkrétne v tomto prípade by sme chceli zrušiť chamtivosť a povedať regulárnemu výrazu, aby hľadal len po prvé písmeno x.
Na obmedzenie chamtivosti je potrebné po operátore opakovania umiestniť znak otáznika:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Chamtivosť možno obmedziť všetkým operátorom
opakovania, takto: *?, ??
a {}?.
Daný reťazec:
<?php
$str = 'aba accca azzza wwwwa';
?>
Napíšte regulárny výraz, ktorý nájde všetky reťazce
na whose okrajoch sú písmená 'a',
a nahradí každý z nich na '!'. Medzi
písmenami a môže byť ľubovoľný znak (okrem
'a').