PHP'de Düzenli İfadelerde İsimli Yakalama Grupları
Diyelim ki preg_match kullanarak
bir tarihi gün, ay ve yıla ayırmak istiyoruz. Bunun
için yakalama gruplarını kullanalım:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // çıktı: ['2025-10-29', '2025', '10', '29']
?>
Gördüğünüz gibi, sonuçta sıfırıncı elemanında tüm tarihin, birincisinde - yılın, ikincisinde - ayın, üçüncüsünde - günün bulunduğu bir dizi elde ediyoruz.
Ancak bazen, yakalama gruplarının içeriğini ilişkisel bir dizi olarak almak uygun olurdu. Yani bizim durumumuzda şöyle bir dizi elde etmek iyi olurdu:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Bunun için düzenli ifadelerde özel bir
sözdizimi vardır. İşte bu: (?<name>pattern),
burada pattern - düzenli ifade, name
- ise yakalama grubunun adıdır.
Şimdi tarih için düzenli ifademizi isimli yakalama gruplarıyla yeniden yazalım:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Sonuçta, anahtarların yakalama gruplarının isimleri, değerlerin ise onların içine düşenler olduğu bir ilişkisel dizi elde edeceğiz:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
Aslında, sonuç dizisinde yakalama gruplarının değerleri
hem isimle hem de sıra numarasıyla erişilebilir olacaktır.
Yani, örneğin, yıla 'year' anahtarı
ve 1 numarasıyla, aya - 'month' anahtarı
ve 2 numarasıyla ve bu şekilde erişilebilir:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Açıklanan isimli yakalama gruplarının birkaç
alternatif sözdizimi daha vardır: (?P<name>pattern)
ve (?'name'pattern).
Zaman içeren bir string verilmiştir:
<?php
$str = '12:59:59';
?>
Saat, dakika ve saniyeleri ayrı isimli yakalama gruplarına yerleştirin.
Sonuç dizisindeki tüm numaralı yakalama gruplarını silen, sadece isimlileri bırakan bir fonksiyon yazın.