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<?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<?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<?php
  $res = preg_replace('#a.+?x#', '!', $str);
?>

Girighet kan begränsas för alla repetitionsoperatorer, så här: *?, ?? och {}?.

Задание 1

Given är en sträng:

php<?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').