Општ број на групи во регуларни изрази во 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',
];
?>
За секој датум ставете го денот во првата група, месецот во втората, а последните две цифри од годината - во третата.