Общий номер карманов в регулярках 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', ]; ?>

Для каждой даты положите день в первый карман, месяц во второй, а последние две цифры года - в третий.