Begränsning av girighet i reguljära uttryck i PHP
Reguljära uttryck är som standard giriga. Det betyder att de fångar maximalt möjligt antal tecken.
Låt oss titta på ett exempel. Anta att vi har följande sträng:
<?php
$str = 'aeeex zzz x kkk';
?>
Anta att vi i denna sträng vill hitta delsträngen
'aeeex' enligt följande mönster: bokstaven
'a', sedan valfritt tecken en eller flera
gånger, sedan bokstaven 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Vi förväntar oss att variabeln som ett resultat
kommer att innehålla strängen '! zzz x kkk'. Men
så är det inte - variabeln innehåller strängen
'! kkk'.
Anledningen är att vårt reguljära uttryck söker efter alla
tecken från bokstaven 'a' till bokstaven 'x'.
Men i vår sträng finns två bokstäver 'x'. På grund av
girigheten händer det så att det reguljära uttrycket söker fram till
den sista 'x':en, och därmed fångar
inte det vi förväntade oss.
Naturligtvis är detta beteende oftast vad vi behöver. Men just i det här fallet skulle vi vilja avbryta girigheten och säga åt det reguljära uttrycket att det ska söka fram till den första 'x':en.
För att begränsa girigheten ska du sätta ett frågetecken efter repetitionsoperatorn:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Girighet kan begränsas för alla repetitionsoperatorer,
så här: *?, ??
och {}?.
Given är en sträng:
<?php
$str = 'aba accca azzza wwwwa';
?>
Skriv ett reguljärt uttryck som hittar alla strängar
som har bokstaven 'a' i båda ändar,
och ersätter var och en av dem med '!'. Mellan
bokstäverna a kan finnas vilket tecken som helst (förutom
'a').