Wspólny numer grup w wyrażeniach regularnych PHP
Rozważmy następującą sytuację. Załóżmy, że mamy
zmienną z rokiem, który może się zmieniać
od 1990 do 2099.
Załóżmy, że chcemy uzyskać ostatnie dwie cyfry
roku do grupy. Napiszmy odpowiednie wyrażenie regularne:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Czeka nas tu jednak jedna niedogodność. Chodzi o to, że dla lat z ubiegłego wieku dwie cyfry trafią do pierwszej grupy, a dla lat z drugiego wieku - do drugiej. Spójrzmy na przykładach.
Oto pierwszy wariant:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
A oto drugi wariant:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Załóżmy teraz, że chcemy zapisać znalezione cyfry roku do zmiennej. Czeka nas problem, ponieważ nie wiemy dokładnie, z którym kluczem pobrać dane z grupy:
<?php
$year = $res[1]; // potrzebny jest klucz 1 lub 2
?>
Można rozwiązać problem za pomocą warunku:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Istnieje jednak prostsze rozwiązanie. Można użyć
specjalnej konstrukcji (?| ). Wszystkie grupy,
które znajdują się wewnątrz niej, będą miały
jeden numer.
Poprawmy nasze wyrażenie regularne
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
I teraz nasz rok na pewno będzie w grupie numer jeden:
<?php
$year = $res[1];
?>
Dane są ciągi znaków z datami, w których rok może
się zmieniać od 1990 do 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Dla każdej daty umieść dzień w pierwszej grupie, miesiąc w drugiej, a ostatnie dwie cyfry roku - w trzeciej.