Yakalama grupları
Parantez () ile yakalama grupları oluşturmayı ve geri referans kullanmayı öğrenirsin.
Yakalama grupları: (...)
Desendeki bir parçayı parantez içine alırsan o parça bir yakalama grubu olur. preg_match sonucunda $matches[1], $matches[2] olarak numaralanır.
Örneğin /(\d{2})\.(\d{2})/ deseni "29.05" ile eşleşince $matches[1] = "29", $matches[2] = "05" olur. $matches[0] her zaman tüm eşleşmeyi tutar.
preg_replace'te yakalanan gruba $1, $2 diye başvurulur. Tarih biçimini tersine çevirmek için preg_replace("/(\d{2})\.(\d{2})/", "$2.$1", "29.05") işe yarar.
İsimli gruplar: (?P<ad>...)
Grup numaraları yerine isim vermek kodu okunaklı yapar. (?P<ad>\w+) biçiminde yazılır; eşleşme sonucu $matches['ad'] ile alınır.
Örnek: preg_match("/(?P<yil>\d{4})/", "2026'da", $m) çağrısından sonra $m['yil'] "2026" değerini taşır. Numara da hâlâ çalışır: $m[1] aynıdır.
PHP 7'den beri (?<ad>...) ve (?P<ad>...) eşdeğerdir. Okunabilirlik için isimli grup tercih edilir.
Uygulama Ad ve soyadı ayır
$line = "Ayşe Demir"; dizesinde preg_match ile iki yakalama grubu kullanarak adı ve soyadı ayır. Deseni "/(\w+) (\w+)/u" biçiminde $pattern'e yaz; u modifier'ı Türkçe harfler için gerekir. $matches[1] ve $matches[2]'yi ayrı satırlarda yazdır.
Örnek çözümü göster
Deseni "/(\w+) (\w+)/u" yap. preg_match($pattern, $line, $matches) çağır. echo $matches[1] . "\n"; ve echo $matches[2] . "\n"; yaz.
Örnek çözüm:
<?php
// preg_match ile ad ve soyadı yakalama gruplarıyla ayır
$line = "Ayşe Demir";
// deseni ve matches'i ayarla
$pattern = "/(\w+) (\w+)/u";
preg_match($pattern, $line, $matches);
// ad ve soyadı yazdır
echo $matches[1] . "\n";
echo $matches[2] . "\n";
Kendini test et
-
preg_replace içinde tüm eşleşmeye nasıl başvurulur?
- $0
- $1
- \g
- group(0)
Cevabı göster
$0 — Doğru. $0 tüm eşleşmeyi, $1 ve sonrası grupları ifade eder.
-
Grup söz dizimleri
- (\w+)
- Adsız yakalama grubu
- (?P<ad>\w+)
- İsimli yakalama grubu
- $1
- Birinci gruba başvuru
- (?:\w+)
- Yakalamayan grup
-
Grupları yer değiştir
$new = preg_replace("/(\w+) (\w+)/", "$____ $1", "Ali Veli");Cevabı göster
$new = preg_replace("/(\w+) (\w+)/", "$2 $1", "Ali Veli");