Godumo apribojimas reguliariosiose išraiškose PHP
Reguliariosios išraiškos pagal nutylėjimą yra godžios. Tai reiškia, kad jos perima kuo daugiau simbolių.
Paaiškinkime pavyzdžiu. Tarkime, kad turime tokią eilutę:
<?php
$str = 'aeeex zzz x kkk';
?>
Tarkime, kad šioje eilutėje norime rasti poeilutę
'aeeex' pagal šį šabloną: raidė
'a', tada bet koks simbolis vieną ar daugiau
kartų, tada raidė 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Tikimės, kad į kintamąjį rezultate
bus įrašyta eilutė '! zzz x kkk'. Tačiau,
taip nėra - į kintamąjį pateikia eilutė
'! kkk'.
Visa tai dėl to, kad mūsų reguliarioji išraiška ieško visų
simbolių nuo raidės 'a' iki raidės 'x'.
Bet mūsų eilutėje yra dvi raidės 'x'. Dėl
godumo pasirodo, kad reguliarioji išraiška ieško iki
pačios paskutinės x raidės, taip perimdama
ne tai, ko tikėjomės.
Žinoma, dažnai toks elgesys mums ir reikalingas. Bet konkrečiai šiuo atveju mes norėtume atšaukti godumą ir nurodyti reguliariajai išraiškai, kad ji ieškotų iki pirmos x raidės.
Norint apriboti godumą, reikia po pasikartojimo operatoriaus įdėti klaustuką:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Godumą galima apriboti visiems pasikartojimo operatoriams,
štai taip: *?, ??
ir {}?.
Duota eilutė:
<?php
$str = 'aba accca azzza wwwwa';
?>
Parašykite reguliąją išraišką, kuri ras visas eilutes,
kurių kraštuose yra raidės 'a',
ir kiekvieną iš jų pakeis '!'. Tarp
raidžių a gali būti bet koks simbolis (išskyrus
'a').