Begrensning av grådighet i regulære uttrykk i PHP
Regulære uttrykk er som standard grådige. Dette betyr at de fanger maksimalt mulig antall tegn.
La oss se på et eksempel. Anta at vi har følgende streng:
<?php
$str = 'aeeex zzz x kkk';
?>
Anta at vi i denne strengen ønsker å finne delstrengen
'aeeex' ved å bruke følgende mønster: bokstaven
'a', deretter hvilket som helst tegn en eller flere
ganger, deretter bokstaven 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Vi forventer at variabelen som et resultat
vil inneholde strengen '! zzz x kkk'. Imidlertid
er ikke dette tilfellet - variabelen får strengen
'! kkk'.
Hele poenget er at vårt regulære uttrykk søker etter alle
tegn fra bokstaven 'a' til bokstaven 'x'.
Men i strengen vår er det to bokstaver 'x'. På grunn av
grådigheten skjer det at det regulære uttrykket søker helt til
den siste 'x'en, og fanger dermed
noe annet enn det vi forventet.
Selvfølgelig er denne oppførselen ofte det vi ønsker. Men akkurat i dette tilfellet ønsket vi å oppheve grådigheten og fortelle det regulære uttrykket at det skal søke til den første 'x'en.
For å begrense grådigheten må du sette et spørsmålstegn etter repetisjonsoperatoren:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Grådighet kan begrenses for alle repetisjonsoperatorer,
slik: *?, ??
og {}?.
Gitt en streng:
<?php
$str = 'aba accca azzza wwwwa';
?>
Skriv et regulært uttrykk som finner alle strenger
som har bokstaven 'a' i begge ender,
og erstatter hver av dem med '!'. Mellom
bokstavene a kan det være hvilket som helst tegn (unntatt
'a').