Begrænsning af grådighed i regulære udtryk i PHP
Regulære udtryk er som standard grådige. Dette betyder, at de fanger det maksimalt mulige antal tegn.
Lad os se på et eksempel. Antag at vi har følgende streng:
<?php
$str = 'aeeex zzz x kkk';
?>
Antag at vi i denne streng ønsker at finde delstrengen
'aeeex' ved hjælp af følgende mønster: bogstavet
'a', derefter et hvilket som helst tegn en eller flere
gange, derefter bogstavet 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Vi forventer, at der som resultat skrives strengen
'! zzz x kkk' til variablen. Dette sker dog
ikke - der kommer strengen '! kkk' i variablen.
Årsagen er, at vores regulære udtryk søger efter alle
tegn fra bogstavet 'a' til bogstavet 'x'.
Men i vores streng er der to bogstaver 'x'. På grund
af grådigheden sker det, at det regulære udtryk søger indtil
den sidste 'x', og derved fanger den ikke det, vi forventede.
Selvfølgelig er denne opførsel ofte det, vi har brug for. Men lige i dette tilfælde ønsker vi at ophæve grådigheden og fortælle det regulære udtryk, at det skal søge indtil den første 'x'.
For at begrænse grådigheden skal du sætte et spørgsmålstegn efter gentagelsesoperatoren:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Grådighed kan begrænses for alle gentagelsesoperatorer,
sådan her: *?, ??
og {}?.
Given streng:
<?php
$str = 'aba accca azzza wwwwa';
?>
Skriv et regulært udtryk, der finder alle strenge
hvis kanter er bogstavet 'a',
og erstatter hver af dem med '!'. Mellem
bogstaverne a kan der være et hvilket som helst tegn (undtagen
'a').