Skupna številka zajetih skupin v regularnih izrazih PHP
Razmislimo o naslednji situaciji. Recimo, da imamo
spremenljivko z letom, ki se lahko spreminja
od 1990 do 2099.
Recimo, da želimo dobiti zadnji dve števki
leta v zajeto skupino. Napišimo ustrezen regularni izraz:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Vendar nas tu čaka ena neprijetnost. Dejstvo je, da bosta za leta prejšnjega stoletja dve števki padli v prvo zajeto skupino, za leta drugega stoletja pa - v drugo. Poglejmo na primerih.
Tu je prva različica:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
In tu je druga različica:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Recimo zdaj, da želimo najdene števke leta zapisati v spremenljivko. Čaka nas težava, ker ne vemo natančno, s katerim ključem naj vzamemo podatke iz zajete skupine:
<?php
$year = $res[1]; // potreben je ključ 1 ali 2
?>
Težavo lahko rešimo s pogojem:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Vendar obstaja enostavnejša rešitev. Uporabiti je mogoče
poseben ukaz (?| ). Vse zajete skupine,
ki so znotraj njega, bodo imele
eno številko.
Popravimo naš regularni izraz
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
In zdaj bo naše leto zagotovo v zajeti skupini s številko ena:
<?php
$year = $res[1];
?>
Podane so nizi z datumi, pri katerih se leto lahko
spreminja od 1990 do 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Za vsak datum položite dan v prvo zajeto skupino, mesec v drugo, zadnji dve števki leta pa - v tretjo.