CodeBlanks Logo Icon CodeBlanks

Yakalama grupları

PHP kursu · İleri seviye · Ders 46/92

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

  1. 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.

  2. Grup söz dizimleri

    (\w+)
    Adsız yakalama grubu
    (?P<ad>\w+)
    İsimli yakalama grubu
    $1
    Birinci gruba başvuru
    (?:\w+)
    Yakalamayan grup
  3. 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");

İleri seviye bölümündeki tüm dersler