Numărul total de grupuri de captură în expresiile regulate PHP
Să luăm în considerare următoarea situație. Să presupunem că avem
o variabilă cu un an care poate varia
de la 1990 la 2099.
Să presupunem că vrem să obținem ultimele două cifre
ale anului într-un grup de captură. Să scriem expresia regulată corespunzătoare:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Cu toate acestea, aici ne așteaptă un inconvenient. Cert este că pentru anii secolului trecut, cele două cifre vor ajunge în primul grup de captură, iar pentru anii secolului al doilea - în al doilea. Să vedem cu exemple.
Iată prima variantă:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Iar aici este a doua variantă:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Să presupunem acum că vrem să scriem cifrele găsite ale anului într-o variabilă. Ne așteaptă o problemă, deoarece nu știm exact cu ce cheie să luăm datele din grupul de captură:
<?php
$year = $res[1]; // este nevoie de cheia 1 sau 2
?>
Problema poate fi rezolvată printr-o condiție:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Cu toate acestea, există o soluție mai simplă. Se poate folosi
comanda specială (?| ). Toate grupurile de captură
care se află în interiorul ei vor avea
același număr.
Să corectăm expresia noastră regulată
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Și acum anul nostru va fi cu siguranță în grupul de captură cu numărul unu:
<?php
$year = $res[1];
?>
Sunt date șiruri cu date, în care anul poate
varia de la 1990 la 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Pentru fiecare dată, plasați ziua în primul grup de captură, luna în al doilea, iar ultimele două cifre ale anului - în al treilea.