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<?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<?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<?php
  $res = preg_replace('#a.+?x#', '!', $str);
?>

Chamtivosť možno obmedziť všetkým operátorom opakovania, takto: *?, ?? a {}?.

Задание 1

Daný reťazec:

php<?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').