Skupna številka zajetih skupin v regularnih izrazih PHP

Razmislimo o naslednji situaciji. Recimo, da imamo spremenljivko z letom, ki se lahko spreminja od 1990 do 2099. Recimo, da želimo dobiti zadnji dve števki leta v zajeto skupino. Napišimo ustrezen regularni izraz:

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

Vendar nas tu čaka ena neprijetnost. Dejstvo je, da bosta za leta prejšnjega stoletja dve števki padli v prvo zajeto skupino, za leta drugega stoletja pa - v drugo. Poglejmo na primerih.

Tu je prva različica:

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

In tu je druga različica:

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

Recimo zdaj, da želimo najdene števke leta zapisati v spremenljivko. Čaka nas težava, ker ne vemo natančno, s katerim ključem naj vzamemo podatke iz zajete skupine:

php<?php
  $year = $res[1]; // potreben je ključ 1 ali 2
?>

Težavo lahko rešimo s pogojem:

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

Vendar obstaja enostavnejša rešitev. Uporabiti je mogoče poseben ukaz (?| ). Vse zajete skupine, ki so znotraj njega, bodo imele eno številko.

Popravimo naš regularni izraz

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

In zdaj bo naše leto zagotovo v zajeti skupini s številko ena:

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

Podane so nizi z datumi, pri katerih se leto lahko spreminja od 1990 do 2099:

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

Za vsak datum položite dan v prvo zajeto skupino, mesec v drugo, zadnji dve števki leta pa - v tretjo.