Beperking van gierigheid in regulêre uitdrukkings in PHP
Regulêre uitdrukkings is by verstek gierig. Dit beteken dat hulle die maksimum moontlike hoeveelheid karakters vang.
Kom ons kyk na 'n voorbeeld. Gestel ons het die volgende string:
<?php
$str = 'aeeex zzz x kkk';
?>
Gestel ons wil in hierdie string die substring
'aeeex' vind volgens die volgende patroon: letter
'a', dan enige karakter een of meer
keer, dan letter 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Ons verwag dat die resultaat in die veranderlike
die string '! zzz x kkk' sal wees. Maar
dit is nie so nie - die string wat in die veranderlike beland is
'! kkk'.
Die rede is dat ons regulêre uitdrukking soek na alle
karakters vanaf letter 'a' tot letter 'x'.
Maar in ons string is daar twee letters 'x'. As gevolg van
gierigheid, soek die regulêre uitdrukking tot by
die laaste x, en vang sodoende nie wat ons verwag het nie.
Natuurlik is hierdie gedrag dikwels wat ons nodig het. Maar spesifiek in hierdie geval wil ons die gierigheid uitskakel en die regulêre uitdrukking sê om tot by die eerste x te soek.
Om gierigheid te beperk, moet jy 'n vraagteken plaas na die herhalingsoperator:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Gierigheid kan vir alle herhalingsoperatore
beperk word, soos volg: *?, ??
en {}?.
Gegee die string:
<?php
$str = 'aba accca azzza wwwwa';
?>
Skryf 'n regulêre uitdrukking wat alle strings vind
waar die letters 'a' aan die kante is,
en vervang elkeen met '!'. Tussen
die letters a kan enige karakter wees (behalwe
'a').