Агульны нумар карманоў у рэгулярках 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',
];
?>
Для кожнай даты пакладзеце дзень у першы карман, месяц у другі, а апошнія дзве лічбы года - у трэці.