Numărul total de grupuri de captură în expresiile regulate PHP

Să luăm în considerare următoarea situație. Să presupunem că avem o variabilă cu un an care poate varia de la 1990 la 2099. Să presupunem că vrem să obținem ultimele două cifre ale anului într-un grup de captură. Să scriem expresia regulată corespunzătoare:

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

Cu toate acestea, aici ne așteaptă un inconvenient. Cert este că pentru anii secolului trecut, cele două cifre vor ajunge în primul grup de captură, iar pentru anii secolului al doilea - în al doilea. Să vedem cu exemple.

Iată prima variantă:

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

Iar aici este a doua variantă:

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

Să presupunem acum că vrem să scriem cifrele găsite ale anului într-o variabilă. Ne așteaptă o problemă, deoarece nu știm exact cu ce cheie să luăm datele din grupul de captură:

php<?php
  $year = $res[1]; // este nevoie de cheia 1 sau 2
?>

Problema poate fi rezolvată printr-o condiție:

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

Cu toate acestea, există o soluție mai simplă. Se poate folosi comanda specială (?| ). Toate grupurile de captură care se află în interiorul ei vor avea același număr.

Să corectăm expresia noastră regulată

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

Și acum anul nostru va fi cu siguranță în grupul de captură cu numărul unu:

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

Sunt date șiruri cu date, în care anul poate varia de la 1990 la 2099:

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

Pentru fiecare dată, plasați ziua în primul grup de captură, luna în al doilea, iar ultimele două cifre ale anului - în al treilea.