Numri i përgjithshëm i xhepa në regex PHP

Le të shqyrtojmë situatën e mëposhtme. Supozoni se kemi një variabël me një vit, i cili mund të ndryshojë nga 1990 në 2099. Supozoni se duam të marrim dy shifrat e fundit të vitit në një xhep. Le të shkruajmë regex-in përkatës:

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

Sidoqoftë, këtu na pret një papërshtatsi. Çështja është se për vitet e shekullit të kaluar, dy shifrat do të përfundojnë në xhepin e parë, ndërsa për vitet e shekullit të dytë - në të dytin. Le të shohim me shembuj.

Këtu është opsioni i parë:

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

Dhe këtu është opsioni i dytë:

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

Supozoni tani që duam të shkruajmë shifrat e gjetura të vitit në një variabël. Ne do të përballemi me një problem, sepse nuk e dimë saktësisht me çelësin e cilin të marrim të dhënat nga xhepi:

php<?php
  $year = $res[1]; // nevojitet çelësi 1 ose 2
?>

Problemi mund të zgjidhet me një kusht:

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

Sidoqoftë, ekziston një zgjidhje më e thjeshtë. Mund të përdorni komandën speciale (?| ). Të gjithë xhepat që janë brenda saj do të kenë një numër.

Le të rregullojmë regex-in tonë

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

Dhe tani viti ynë me siguri do të jetë në xhepin numër një:

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

Janë dhënë stringje me data, në të cilat viti mund të ndryshojë nga 1990 në 2099:

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

Për çdo datë, vendosni ditën në xhepin e parë, muajin në të dytin, dhe dy shifrat e fundit të vitit - në të tretin.