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
$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
$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
$res = preg_replace('#a.+?x#', '!', $str);
?>
Pohlepu možemo ograničiti svim operatorima
ponavljanja, ovako: *?, ??
i {}?.
Dat je string:
<?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').