Celkový počet zachytávacích skupin v regulárních výrazech PHP

Uvažujme následující situaci. Předpokládejme, že máme proměnnou s rokem, který se může měnit od 1990 do 2099. Řekněme, že chceme získat poslední dvě číslice roku do zachytávací skupiny. Napišme odpovídající regulární výraz:

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

Zde na nás však čeká jedno nepohodlí. Jde o to, že pro roky minulého století se dvě číslice dostanou do první zachytávací skupiny, zatímco pro roky druhého století - do druhé. Podívejme se na příklady.

Zde je první varianta:

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

A zde je druhá varianta:

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

Řekněme nyní, že chceme zapsat nalezené číslice roku do proměnné. Čeká nás problém, protože nevíme přesně, pod jakým klíčem vzít data ze zachytávací skupiny:

php<?php
  $year = $res[1]; // je potřeba klíč buď 1, nebo 2
?>

Problém lze vyřešit pomocí podmínky:

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

Existuje však jednodušší řešení. Lze použít speciální příkaz (?| ). Všechny zachytávací skupiny, které se nacházejí uvnitř ní, budou mít stejné číslo.

Pojďme opravit náš regulární výraz

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

A nyní bude náš rok určitě v zachytávací skupině s číslem jedna:

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

Jsou dány řetězce s daty, ve kterých se rok může měnit od 1990 do 2099:

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

Pro každé datum vložte den do první zachytávací skupiny, měsíc do druhé a poslední dvě číslice roku - do třetí.