Kopējais numuru kabatu regulārajās izteiksmēs PHP

Apskatīsim šādu situāciju. Pieņemsim, ka mums ir mainīgais ar gadu, kas var mainīties no 1990 līdz 2099. Pieņemsim, ka mēs vēlamies iegūt pēdējos divus ciparus gada kabatā. Uzrakstīsim atbilstošu regulāro izteiksmi:

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

Tomēr šeit mūs sagaida viena neērtība. Lieta ir tāda, ka pagājušā gadsimta gadiem divi cipari nonāks pirmajā kabatā, bet otrā gadsimta gadiem - otrajā. Apskatīsim ar piemēriem.

Lūk, pirmais variants:

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

Un lūk, otrais variants:

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

Pieņemsim, ka mēs tagad vēlamies ierakstīt atrastos gada ciparus mainīgajā. Mūs sagaida problēma, jo mēs nezinām precīzi, ar kuru atslēgu paņemt datus no kabatas:

php<?php
  $year = $res[1]; // nepieciešama atslēga 1 vai 2
?>

Problēmu var atrisināt ar nosacījumu:

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

Tomēr ir vienkāršāks risinājums. Var izmantot īpašo komandu (?| ). Visas kabatas, kas atrodas tajā iekšpusē, būs ar vienu numuru.

Izlabosim mūsu regulāro izteiksmi

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

Un tagad mūsu gads noteikti būs kabatā ar numuru viens:

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

Dotas virknes ar datumiem, kuros gads var mainīties no 1990 līdz 2099:

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

Katram datumam ievietojiet dienu pirmajā kabatā, mēnesi otrajā, bet pēdējos divus gada ciparus - trešajā.