Regularās izteiksmes alkatības ierobežošana PHP
Regularās izteiksmes pēc noklusējuma ir alkatīgas. Tas nozīmē, ka tās saglabā maksimālo iespējamo simbolu daudzumu.
Analizēsim to ar piemēru. Pieņemsim, ka mums ir šāda virkne:
<?php
$str = 'aeeex zzz x kkk';
?>
Pieņemsim, ka šajā virknē vēlamies atrast apakšvirkni
'aeeex' pēc šāda parauga: burts
'a', pēc tam jebkura simbols viens vai vairāk
reizes, pēc tam burts 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Mēs sagaidām, ka mainīgā rezultātā
tiks ierakstīta virkne '! zzz x kkk'. Tomēr
tā nenotiek - mainīgā nonāk virkne
'! kkk'.
Lieta ir tajā, ka mūsu regulārā izteiksme meklē visus
simbolus no burta 'a' līdz burtam 'x'.
Bet mūsu virknē ir divi burti 'x'. Alkātības
dēļ izrādās, ka regulārā izteiksme meklē līdz
pat pēdējam x, tādējādi saglabājot
nevis to, ko mēs gaidījām.
Protams, bieži vien šāda uzvedība mums ir vajadzīga. Bet tieši šajā gadījumā mēs vēlētos atcelt alkatību un likt regulārajai izteiksmei meklēt līdz pirmajam x.
Lai ierobežotu alkatību, aiz atkārtošanās operatora jāievieto jautājuma zīme:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Alkatību var ierobežot visiem atkārtošanās operatoriem,
šeit: *?, ??
un {}?.
Dota virkne:
<?php
$str = 'aba accca azzza wwwwa';
?>
Uzrakstiet regulāro izteiksmi, kas atradīs visas virknes,
kuru malās atrodas burti 'a',
un aizstās katru no tām ar '!'. Starp
btiem a var būt jebkurš simbols (izņemot
'a').