Celkový počet zachytávacích skupin v regulárních výrazech PHP
Uvažujme následující situaci. Předpokládejme, že máme
proměnnou s rokem, který se může měnit
od 1990 do 2099.
Řekněme, že chceme získat poslední dvě číslice
roku do zachytávací skupiny. Napišme odpovídající regulární výraz:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Zde na nás však čeká jedno nepohodlí. Jde o to, že pro roky minulého století se dvě číslice dostanou do první zachytávací skupiny, zatímco pro roky druhého století - do druhé. Podívejme se na příklady.
Zde je první varianta:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
A zde je druhá varianta:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Řekněme nyní, že chceme zapsat nalezené číslice roku do proměnné. Čeká nás problém, protože nevíme přesně, pod jakým klíčem vzít data ze zachytávací skupiny:
<?php
$year = $res[1]; // je potřeba klíč buď 1, nebo 2
?>
Problém lze vyřešit pomocí podmínky:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Existuje však jednodušší řešení. Lze použít
speciální příkaz (?| ). Všechny zachytávací skupiny,
které se nacházejí uvnitř ní, budou mít
stejné číslo.
Pojďme opravit náš regulární výraz
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
A nyní bude náš rok určitě v zachytávací skupině s číslem jedna:
<?php
$year = $res[1];
?>
Jsou dány řetězce s daty, ve kterých se rok může
měnit od 1990 do 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Pro každé datum vložte den do první zachytávací skupiny, měsíc do druhé a poslední dvě číslice roku - do třetí.