Ograničavanje pohlepe u regularnim izrazima u PHP-u

Regularni izrazi su podrazumevano pohlepni. To znači da hvataju maksimalan mogući broj karaktera.

Hajde da razmotrimo primer. Pretpostavimo da imamo ovakav string:

php<?php
  $str = 'aeeex zzz x kkk';
?>

Pretpostavimo da u ovom stringu želimo da pronađemo podstring 'aeeex' koristeći sledeći šablon: slovo 'a', zatim bilo koji karakter jedan ili više puta, zatim slovo 'x'.

php<?php
  $res = preg_replace('#a.+x#', '!', $str);
?>

Očekujemo da će se u promenljivu kao rezultat upisati string '! zzz x kkk'. Međutim, to nije slučaj - u promenljivu se upisuje string '! kkk'.

Stvar je u tome što naš regularni izraz traži sve karaktere od slova 'a' do slova 'x'. Ali u našem stringu se nalaze dva slova 'x'. Zbog pohlepe se dešava da regularni izraz traži do poslednjeg slova x, time hvatajući nešto što nismo očekivali.

Naravno, često je ovo ponašanje upravo ono što nam je potrebno. Ali konkretno u ovom slučaju želimo da poništimo pohlepu i kažemo regularnom izrazu da traži do prvog slova x.

Da bismo ograničili pohlepu, potrebno je da posle operatora ponavljanja stavimo znak pitanja:

php<?php
  $res = preg_replace('#a.+?x#', '!', $str);
?>

Pohlepu možemo ograničiti svim operatorima ponavljanja, ovako: *?, ?? i {}?.

Задание 1

Dat je string:

php<?php
  $str = 'aba accca azzza wwwwa';
?>

Napišite regularni izraz koji će pronaći sve stringove na čijim krajevima se nalaze slova 'a', i zameniti svaki od njih sa '!'. Između slova a može biti bilo koji karakter (osim 'a').