PHP'de Düzenli İfadelerde Açgözlülüğü Sınırlama
Düzenli ifadeler varsayılan olarak açgözlüdür. Bu, mümkün olan en fazla karakteri yakalamaya çalıştıkları anlamına gelir.
Bir örnekle inceleyelim. Diyelim ki şöyle bir dizgemiz var:
<?php
$str = 'aeeex zzz x kkk';
?>
Diyelim ki bu dizgede 'aeeex'
alt dizisini şu şablona göre bulmak istiyoruz: 'a' harfi,
ardından herhangi bir karakter bir veya daha fazla kez,
ardından 'x' harfi.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Beklentimiz, sonuçta değişkene
'! zzz x kkk' dizgisinin yazılmasıdır. Ancak,
öyle olmuyor - değişkene
'! kkk' dizgisi yazılıyor.
Bunun nedeni, düzenli ifademizin
'a' harfinden 'x' harfine kadar olan tüm
karakterleri aramasıdır.
Ancak dizgemizde iki tane 'x' harfi var.
Açgözlülük nedeniyle, düzenli ifade
son 'x' harfine kadar arama yaparak
beklediğimizden farklı bir şeyi yakalıyor.
Elbette, çoğu zaman bu davranış tam da ihtiyacımız olan şeydir.
Ancak bu özel durumda, açgözlülüğü iptal etmek
ve düzenli ifadeye ilk 'x' harfine kadar arama yapmasını söylemek istiyoruz.
Açgözlülüğü sınırlamak için, tekrarlama operatöründen sonra soru işareti konulmalıdır:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Açgözlülük tüm tekrarlama operatörleri
için sınırlandırılabilir, şu şekilde: *?, ??
ve {}?.
Şu dizge verilmiştir:
<?php
$str = 'aba accca azzza wwwwa';
?>
Kenarlarında 'a' harfleri bulunan tüm dizgileri bulan
ve her birini '!' ile değiştiren bir düzenli ifade yazın.
a harfleri arasında ('a' hariç)
herhangi bir karakter bulunabilir.