Wspólny numer grup w wyrażeniach regularnych PHP

Rozważmy następującą sytuację. Załóżmy, że mamy zmienną z rokiem, który może się zmieniać od 1990 do 2099. Załóżmy, że chcemy uzyskać ostatnie dwie cyfry roku do grupy. Napiszmy odpowiednie wyrażenie regularne:

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

Czeka nas tu jednak jedna niedogodność. Chodzi o to, że dla lat z ubiegłego wieku dwie cyfry trafią do pierwszej grupy, a dla lat z drugiego wieku - do drugiej. Spójrzmy na przykładach.

Oto pierwszy wariant:

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

A oto drugi wariant:

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

Załóżmy teraz, że chcemy zapisać znalezione cyfry roku do zmiennej. Czeka nas problem, ponieważ nie wiemy dokładnie, z którym kluczem pobrać dane z grupy:

php<?php
  $year = $res[1]; // potrzebny jest klucz 1 lub 2
?>

Można rozwiązać problem za pomocą warunku:

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

Istnieje jednak prostsze rozwiązanie. Można użyć specjalnej konstrukcji (?| ). Wszystkie grupy, które znajdują się wewnątrz niej, będą miały jeden numer.

Poprawmy nasze wyrażenie regularne

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

I teraz nasz rok na pewno będzie w grupie numer jeden:

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

Dane są ciągi znaków z datami, w których rok może się zmieniać od 1990 do 2099:

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

Dla każdej daty umieść dzień w pierwszej grupie, miesiąc w drugiej, a ostatnie dwie cyfry roku - w trzeciej.