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

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

←→
↑