Totalt antall lommer i regex i PHP

La oss vurdere følgende situasjon. Anta at vi har en variabel med et år som kan variere fra 1990 til 2099. Anta at vi ønsker å få de to siste sifrene i året i en lomme. La oss skrive det tilsvarende regulære uttrykket:

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

Her venter imidlertid en ulempe på oss. Saken er at for årene i forrige århundre vil de to sifrene havne i den første lommen, mens for årene i det andre århundret - i den andre. La oss se på eksempler.

Her er det første alternativet:

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

Og her er det andre alternativet:

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

Anta nå at vi ønsker å skrive de funnet årets sifrer inn i en variabel. Vi står overfor et problem, for vi vet ikke nøyaktig med hvilken nøkkel vi skal hente dataene fra lommen:

php<?php
  $year = $res[1]; // trenger nøkkel enten 1 eller 2
?>

Problemet kan løses med en betingelse:

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

Det finnes imidlertid en enklere løsning. Du kan bruke en spesiell kommando (?| ). Alle lommer som er innenfor den vil ha ett nummer.

La oss korrigere vårt regulære uttrykk

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

Og nå vil året vårt definitivt være i lommen med nummer én:

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

Det gis strenger med datoer, der året kan variere fra 1990 til 2099:

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

For hver dato, legg dagen i den første lommen, måneden i den andre, og de to siste sifrene i året - i den tredje.