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<?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:

php[
  '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<?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:

php[
  '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:

php[
  '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).

Задание 1

Zaman içeren bir string verilmiştir:

php<?php
  $str = '12:59:59';
?>

Saat, dakika ve saniyeleri ayrı isimli yakalama gruplarına yerleştirin.

Задание 2

Sonuç dizisindeki tüm numaralı yakalama gruplarını silen, sadece isimlileri bırakan bir fonksiyon yazın.