PHP Düzenli İfadelerde Genel Cep Numarası

Aşağıdaki durumu ele alalım. Elimizde, 1990 ile 2099 arasında değişebilen bir yıl değişkeni olduğunu varsayalım. Yılın son iki hanesini bir cepte elde etmek istediğimizi varsayalım. İlgili düzenli ifadeyi yazalım:

php<?php
  $reg = '#19(9\d)|20(\d\d)#';
?>

Ancak burada bizi bir rahatsızlık bekliyor. Mesele şu ki, geçen yüzyılın yılları için son iki hane ilk cepte, ikinci yüzyılın yılları için ise ikinci cepte olacak. Örnekler üzerinde görelim.

İşte ilk seçenek:

php<?php
  $str = '1991';
  preg_match($reg, $str, $res);
  var_dump($res); // [1 => '91']
?>

İşte ikinci seçenek:

php<?php
  $str = '2021';
  preg_match($reg, $str, $res);
  var_dump($res); // [2 => '21']
?>

Şimdi bulunan yıl hanelerini bir değişkene yazmak istediğimizi varsayalım. Bir sorunla karşılaşacağız, çünkü veriyi cepten alırken hangi anahtarı kullanacağımızı tam olarak bilmiyoruz:

php<?php
  $year = $res[1]; // 1 veya 2 anahtarı gerekli
?>

Sorun bir koşul ile çözülebilir:

php<?php
  if (!empty($res[1])){
    $year = $res[1];
  } else{
    $year = $res[2];
  }
?>

Ancak daha basit bir çözüm var. (?| ) özel komutu kullanılabilir. İçinde bulunan tüm cepler aynı numaraya sahip olacaktır.

Düzenli ifademizi düzeltelim

php<?php
  $reg = '#(?|19(9\d)|20(\d\d))#';
?>

Ve şimdi yılımız kesinlikle bir numaralı cepte olacak:

php<?php
  $year = $res[1];
?>
Задание 1

Yılı 1990 ile 2099 arasında değişebilen tarih içeren dizeler verilmiştir:

php<?php
  $arr = [
    '31-12-2025',
    '30-11-1995',
    '29-10-1990',
  ];
?>

Her tarih için günü birinci cepe, ayı ikinci cepe, ve yılın son iki hanesini üçüncü cepe yerleştirin.