Kuzuia Uwezo wa Regular Expressions katika PHP
Regular expressions kwa default ni greedy. Hii inamaanisha kuwa hunasa idadi kubwa iwezekanavyo ya herufi.
Wacha tuchambue kwa mfano. Hebu tuseme tuna mfuatano kama huu:
<?php
$str = 'aeeex zzz x kkk';
?>
Hebu tuseme katika mfuatano huu tunataka kupata kipande cha mfuatano
'aeeex' kulingana na muundo ufuatao: herufi
'a', kisha herufi yoyote mara moja au zaidi,
kisha herufi 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Tunatarajia kuwa kwenye kibadilishaji matokeo
ya kuandikwa ni mfuatano '! zzz x kkk'. Hata hivyo,
hii sio kweli - kwenye kibadilishaji huandikwa mfuatano
'! kkk'.
Shida yote ni kwamba regular yetu inatafuta herufi zote
kutoka herufi 'a' hadi herufi 'x'.
Lakini katika mfuatano wetu kuna herufi mbili 'x'. Kwa sababu
ya uwezo hutokea kwamba regular inatafuta hadi
herufi ya mwisho ya x, na hivyo kushika
sio kile tulichotarajia.
Bila shaka, mara nyingi tabia kama hii ndiyo tunayohitaji. Lakini hasa katika kesi hii tungependa kukataa uwezo na kuambia regular itafute mpaka herufi ya kwanza ya x.
Ili kuzuia uwezo, unahitaji kuweka alama ya swali baada ya kiendeshaji cha kurudia:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Uwezo unaweza kuzuiwa kwa waendeshaji wote
wa kurudia, kama hivi: *?, ??
na {}?.
Imetolewa mfuatano:
<?php
$str = 'aba accca azzza wwwwa';
?>
Andika regular, ambayo itapata mifuatano yote
ambayo kwenye pembe zake kuna herufi 'a',
na kila moja itabadilishwa na '!'. Kati
ya herufi a kunaweza kuwa na herufi yoyote (isipokuwa
'a').