Regulaaravaldiste ahnuse piiramine PHP-s
Regulaaravaldised on vaikimisi ahnad. See tähendab, et nad püüavad kinni võimalikult palju sümboleid.
Vaatame seda näitega. Oletame, et meil on järgmine string:
<?php
$str = 'aeeex zzz x kkk';
?>
Oletame, et selles stringis soovime leida alamstringi
'aeeex' järgmise mustri järgi: täht
'a', seejärel suvaline sümbol üks või enam
kordi, seejärel täht 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Ootame, et muutujasse kirjutatakse tulemusena
string '! zzz x kkk'. Siiski,
nii ei juhtu - muutujasse satub string
'! kkk'.
Asi on selles, et meie regulaaravaldis otsib kõiki
sümboleid tähest 'a' kuni täheni 'x'.
Kuid meie stringis on kaks tähte 'x'.
Ahnuse tõttu juhtub nii, et regulaaravaldis otsib kuni
viimase 'x'-ni, haarates seeläbi
mitte seda, mida me ootasime.
Muidugi on selline käitumine sageli just see, mida me vajame. Kuid konkreetsel juhul sooviksime ahnust tühistada ja öelda regulaaravaldisele, et see otsiks esimest 'x'-i.
Ahnuse piiramiseks tuleb kordusoperaatori järele panna küsimärk:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Ahnust saab piirata kõikidele kordusoperaatoritele,
nagu nii: *?, ??
ja {}?.
Antud string:
<?php
$str = 'aba accca azzza wwwwa';
?>
Kirjutage regulaaravaldis, mis leiab kõik stringid,
mille mõlemas otsas on tähed 'a',
ja asendab igaühe neist '!'-ga.
Tähtede a vahel võib olla suvaline sümbol (välja arvatud
'a').