PHP Regular Ifodalarida Umumiy Karmon Raqami

Куйидаги вазиятни кўриб чикайлик. Фарз килайлик, бизда ўзгариши мумкин бўлган йил ўзгаргучиси бор, у 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',
  ];
?>

Ҳар бир санат учун кунни биринчи карманга, ойни иккинчи карманга, сўнги икки йил рақамини эса - учинчи карманга қўйинг.