Opšti broj grupa u regularnim izrazima PHP
Razmotrimo sledeću situaciju. Pretpostavimo da imamo
varijablu sa godinom, koja može varirati
od 1990 do 2099.
Recimo da želimo da dobijemo poslednje dve cifre
godine u grupu. Napišimo odgovarajući regularni izraz:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Međutim, ovde nas čeka jedna neprijatnost. Stvar je u tome što će za godine prošlog veka dve cifre završiti u prvoj grupi, a za godine drugog veka - u drugoj. Pogledajmo na primerima.
Evo prvog primera:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
A evo drugog primera:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Pretpostavimo sada da želimo da pronađene cifre godine zapišemo u varijablu. Suočićemo se sa problemom, jer ne znamo tačno sa kojim ključem da uzmemo podatke iz grupe:
<?php
$year = $res[1]; // potreban je ključ 1 ili 2
?>
Problem se može rešiti uslovom:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Međutim, postoji jednostavnije rešenje. Možete koristiti
posebnu komandu (?| ). Sve grupe
koje se nalaze unutar nje će imati
isti broj.
Hajde da ispravimo naš regularni izraz
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
I sada će naša godina sigurno biti u grupi sa brojem jedan:
<?php
$year = $res[1];
?>
Date su niske sa datumima, u kojima godina može
varirati od 1990 do 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Za svaki datum stavite dan u prvu grupu, mesec u drugu, a poslednje dve cifre godine - u treću.