Opšti broj grupa u regularnim izrazima PHP

Razmotrimo sledeću situaciju. Pretpostavimo da imamo varijablu sa godinom, koja može varirati od 1990 do 2099. Recimo da želimo da dobijemo poslednje dve cifre godine u grupu. Napišimo odgovarajući regularni izraz:

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

Međutim, ovde nas čeka jedna neprijatnost. Stvar je u tome što će za godine prošlog veka dve cifre završiti u prvoj grupi, a za godine drugog veka - u drugoj. Pogledajmo na primerima.

Evo prvog primera:

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

A evo drugog primera:

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

Pretpostavimo sada da želimo da pronađene cifre godine zapišemo u varijablu. Suočićemo se sa problemom, jer ne znamo tačno sa kojim ključem da uzmemo podatke iz grupe:

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

Problem se može rešiti uslovom:

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

Međutim, postoji jednostavnije rešenje. Možete koristiti posebnu komandu (?| ). Sve grupe koje se nalaze unutar nje će imati isti broj.

Hajde da ispravimo naš regularni izraz

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

I sada će naša godina sigurno biti u grupi sa brojem jedan:

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

Date su niske sa datumima, u kojima godina može varirati od 1990 do 2099:

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

Za svaki datum stavite dan u prvu grupu, mesec u drugu, a poslednje dve cifre godine - u treću.