PHPda muntazam ifodalarda ochko‘zlikni cheklash
Muntazam ifodalar sukut bo‘yicha ochko‘z. Bu ular maksimal miqdordagi belgilarni qamrab olishini anglatadi.
Keling, buni misol bilan ko‘rib chiqaylik. Faraz qilaylik, bizda quyidagi satr bor:
<?php
$str = 'aeeex zzz x kkk';
?>
Faraz qilaylik, biz ushbu satrda 'aeeex' pastki satrini
quyidagi andozaga asosan topishni xohlaymiz: 'a' harfi,
keyin bir yoki bir necha marta ixtiyoriy belgi,
keyin 'x' harfi.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Biz natijada o‘zgaruvchiga '! zzz x kkk' satri yozilishini kutamiz. Biroq,
bunday bo‘lmaydi - o‘zgaruvchiga '! kkk' satri kiradi.
Muammo shundaki, bizning muntazam ifoda 'a' harfidan
'x' harfigacha bo‘lgan barcha belgilarni qidiradi.
Lekin bizning satrimizda ikkita 'x' harfi bor.
Ochko‘zlik tufayli muntazam ifoda oxirgi 'x'gacha qidiradi,
shu bilan biz kutgandan boshqasini qamrab oladi.
Albatta, ko‘p hollarda aynan shunday xatti-harakat kerak bo‘ladi.
Lekin aynan ushbu holatda biz ochko‘zlikni bekor qilishni
va muntazam ifodaga birinchi 'x'gacha qidirishni aytishni xohlaymiz.
Ochko‘zlikni cheklash uchun takrorlash operatoridan keyin so‘roq belgisini qo‘yish kerak:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Ochko‘zlikni barcha takrorlash operatorlari uchun cheklash mumkin,
quyidagicha: *?, ??
va {}?.
Berilgan satr:
<?php
$str = 'aba accca azzza wwwwa';
?>
Chettida 'a' harflari turgan barcha satrlarni topadigan
va ularning har birini '!' bilan almashtiradigan muntazam ifoda yozing.
a harflari orasida ixtiyoriy belgi ('a'dan tashqari) bo‘lishi mumkin.