Celkový počet zachytávacích skupín v regulárnych výrazoch PHP
Zvážme nasledujúcu situáciu. Predpokladajme, že máme
premennú s rokom, ktorý sa môže meniť
od 1990 do 2099.
Povedzme, že chceme získať posledné dve číslice
roku do zachytávacej skupiny. Napíšme zodpovedajúci regulárny výraz:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Tu nás však čaká jedna nepríjemnosť. Faktom je, že pre roky minulého storočia dve čísla budú v prvej zachytávacej skupine, zatiaľ čo pre roky druhého storočia - v druhej. Pozrime sa na príkladoch.
Tu je prvá možnosť:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
A tu je druhá možnosť:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Povedzme teraz, že chceme uložiť nájdené číslice roka do premennej. Čaká nás problém, pretože nevieme presne, pod ktorým kľúčom máme získať dáta zo zachytávacej skupiny:
<?php
$year = $res[1]; // potrebný je kľúč 1 alebo 2
?>
Problém môžeme vyriešiť pomocou podmienky:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Existuje však jednoduchšie riešenie. Môžeme použiť
špeciálny príkaz (?| ). Všetky zachytávacie skupiny,
ktoré sa nachádzajú vnútri nej, budú mať
rovnaké číslo.
Opravme náš regulárny výraz
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
A teraz bude náš rok určite v zachytávacej skupine s číslom jedna:
<?php
$year = $res[1];
?>
Sú dané reťazce s dátumami, v ktorých sa rok môže
meniť od 1990 do 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Pre každý dátum uložte deň do prvej zachytávacej skupiny, mesiac do druhej a posledné dve číslice roka - do tretej.