PHP'de Düzenli İfadelerde Yakalama Grupları
Yakalama gruplarının içeriği yalnızca değiştirme dizesinde değil, aynı zamanda düzenli ifadenin kendisinde de kullanılabilir: bir yakalama grubuna bir şey koyabiliriz ve sonra doğrudan düzenli ifadede, burada o yakalama grubunun içeriğinin olması gerektiğini söyleyebiliriz.
Yakalama gruplarının içeriği, başlarında
ters eğik çizgi bulunan numaralarıyla
erişilebilir. Örneğin,
sıfırıncı yakalama grubu şu şekilde
erişilebilir: \0,
birinci yakalama grubu şu şekilde -
\1, ikinci
- \2 ve bu şekilde devam eder.
Yukarıda yazılanların hepsinin sizin için şu an oldukça belirsiz olduğundan eminim. Bu şaşırtıcı değil, çünkü yakalama grupları düzenli ifadelerin en anlaşılması zor yeridir. Haydi örneklerle anlamaya çalışalım.
Örnek
Diyelim ki şöyle bir dizgemiz var:
<?php
$str = 'aa bb cd ef';
?>
Şimdi içinde arka arkaya iki tane aynı harfin bulunduğu tüm yerleri bulalım. Görevi çözmek için herhangi bir harfi arayacağız, onu bir yakalama grubuna koyacağız ve sonra bir sonraki karakterin bu yakalama grubunun içeriği olup olmadığını kontrol edeceğiz:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Sonuç olarak değişkene şunlar yazılacak:
'! ! cd ef'
Örnek
Diyelim ki şöyle bir dizgemiz var:
<?php
$str = 'asxca buzxb csgd';
?>
Şimdi içinde ilk ve son harfin aynı olduğu tüm kelimeleri bulalım. Görevi çözmek için şu kalıbı yazacağız: bir harf, ardından bir veya daha fazla harf ve sonra ilk harfle aynı olan bir harf:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Sonuç olarak değişkene şunlar yazılacak:
'! ! csgd'
Örnek
\1 yerine \g1 da yazılabilir:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Örnek
Ayrıca \g{1} da yazılabilir:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Örnek
Küme parantezleri içinde negatif sayılar belirtilebilir. Bu durumda yakalama grupları sondan sayılmaya başlanacaktır:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Pratik Görevler
Bir dize verildi:
<?php
$str = 'aaa bbb ccc xyz';
?>
İçinde arka arkaya üç aynı harfin bulunduğu tüm alt dizileri bulun.
Bir dize verildi:
<?php
$str = 'a aa aaa abab bbbb';
?>
İçinde arka arkaya iki veya daha fazla aynı harfin bulunduğu tüm alt dizileri bulun.
Bir dize verildi:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
İçinde arka arkaya iki aynı kelimenin bulunduğu tüm alt dizileri bulun.