Ընդհանուր համարի գրպանները PHP-ի կանոնավոր արտահայտություններում

Դիտարկենք հետևյալ իրավիճակը. Ենթադրենք ունենք տարվա հետ կապված փոփոխական, որը կարող է փոխվել 1990-ից մինչև 2099: Ենթադրենք, մենք ցանկանում ենք ստանալ տարվա վերջին երկու թվանշանները գրպանում: Գրենք համապատասխան կանոնավոր արտահայտություն.

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

Սակայն, այստեղ մեզ սպասվում է մի անհարմարություն: Բանը նրանում է, որ անցյալ դարի տարիների համար երկու թվանշանը կընկնի առաջին գրպանը, իսկ երկրորդ դարի տարիների համար՝ երկրորդը: Դիտարկենք օրինակներով:

Ահա առաջին տարբերակը.

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

Իսկ ահա երկրորդ տարբերակը.

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

Ենթադրենք հիմա, որ մենք ցանկանում ենք գտնված տարվա թվանշանները գրել փոփոխականի մեջ: Մեզ սպասվում է խնդիր, քանի որ մենք հստակ չգիտենք, թե որ բանալիով վերցնել տվյալները գրպանից.

php<?php
  $year = $res[1]; // պետք է բանալին՝ 1 կամ 2
?>

Խնդիրը կարելի է լուծել պայմանի միջոցով.

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

Սակայն, կա ավելի պարզ լուծում: Կարելի է օգտագործել հատուկ հրաման (?| ): Դրա ներսում գտնվող բոլոր գրպանները կունենան նույն համարը:

Ուղղենք մեր կանոնավոր արտահայտությունը

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

Եվ այժմ մեր տարին հաստատ կլինի մեկ համարով գրպանում.

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

Տրված են ամսաթիվ պարունակող տողեր, որոնցում տարին կարող է փոխվել 1990-ից մինչև 2099.

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

Յուրաքանչյուր ամսաթվի համար տեղադրեք օրը առաջին գրպանում, ամիսը՝ երկրորդում, իսկ տարվա վերջին երկու թվանշանները երրորդում: