Общ номер на групи в регулярни изрази в PHP
Нека разгледаме следната ситуация. Да предположим, че имаме
променлива с година, която може да се променя
от 1990 до 2099.
Да предположим, че искаме да получим последните две цифри
на годината в група. Нека напишем съответния регулярен израз:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Тук обаче ни очаква едно неудобство. Работата е там, че за години от миналия век последните две цифри ще попаднат в първата група, а за години от настоящия век - във втората. Нека видим с примери.
Ето първия вариант:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
А ето и втория вариант:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Да предположим сега, че искаме да запишем намерените цифри на годината в променлива. Ние се сблъскваме с проблем, тъй като не знаем точно с кой ключ да вземем данните от групата:
<?php
$year = $res[1]; // нужен е ключ или 1, или 2
?>
Проблемът може да се реши чрез условие:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Въпреки това, има по-просто решение. Може да се използва
специалната команда (?| ). Всички групи,
които се намират вътре в нея ще имат
един и същ номер.
Нека поправим нашия регулярен израз
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
И сега нашата година определено ще бъде в група с номер едно:
<?php
$year = $res[1];
?>
Дадени са низове с дати, в които годината може
да варира от 1990 до 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
За всяка дата поставете деня в първата група, месеца във втората, а последните две цифри на годината - в третата.