A kapzsiság korlátozása reguláris kifejezésekben PHP-ben
A reguláris kifejezések alapértelmezetten kapzsiak. Ez azt jelenti, hogy a lehető legtöbb karaktert próbálják megragadni.
Nézzünk egy példát. Tegyük fel, hogy van egy ilyen karakterláncunk:
<?php
$str = 'aeeex zzz x kkk';
?>
Tegyük fel, hogy ebben a karakterláncban meg szeretnénk találni a
'aeeex' részt a következő minta alapján: az
'a' betű, majd bármely karakter egy vagy többször,
majd az 'x' betű.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Arra számítanánk, hogy az eredményül kapott változó
a '! zzz x kkk' karakterlánc lesz. Azonban
ez nem így van - a változóba a
'! kkk' karakterlánc kerül.
Az egész azon múlik, hogy a reguláris kifejezésünk minden
karaktert keres az 'a' betűtől az 'x' betűig.
De a karakterláncunkban két 'x' betű van. A
kapzsiság miatt az történik, hogy a regex a
legutolsó x-ig keres, ezzel megragadva
nem azt, amire számítottunk.
Természetesen gyakran pontosan ez a viselkedés a szükséges. De ebben a konkrét esetben szeretnénk megszüntetni a kapzsiságot, és azt mondani a regexnek, hogy az első x-ig keressen.
A kapzsiság korlátozásához az ismétlési operátor után kérdőjelet kell tenni:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
A kapzsiság minden ismétlési operátornál
korlátozható, így: *?, ??
és {}?.
Adott egy karakterlánc:
<?php
$str = 'aba accca azzza wwwwa';
?>
Írjon reguláris kifejezést, amely meg fogja találni az összes olyan karakterláncot,
amelynek szélein 'a' betűk állnak,
és mindegyiket lecseréli '!'-ra. Az
a betűk között bármilyen karakter lehet (kivéve
'a').