Именованные карманы в регулярках PHP

Пусть с помощью preg_match, мы хотим разбить дату на день, месяц и год. Используем для этого карманы:

<?php $str = '2025-10-29'; $reg = '#(\d{4})-(\d{2})-(\d{2})#'; preg_match($reg, $str, $match); var_dump($match); // выведет ['2025-10-29', '2025', '10', '29'] ?>

Как вы видите, в результате мы получаем массив, в котором в нулевом элементе будет вся дата, в первом - год, во втором - месяц, в третьем - день.

Иногда, однако, было бы удобно получить содержимое карманов в виде ассоциативного массива. То есть в нашем случае было бы неплохо получить вот такой массив:

[ 'year' => '2025', 'month' => '10', 'day' => '29' ]

Для этого в регулярках существует специальный синтаксис. Вот он: (?<name>pattern), где pattern - это регулярка, а name - это имя кармана.

Давайте перепишем нашу регулярку для даты через именованные карманы:

<?php $str = '2025-10-29'; $reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#'; preg_match($reg, $str, $match); var_dump($match); ?>

В результате у нас получится ассоциативный массив, в котором ключами будут имена карманов, а значениями - то, что в них попало:

[ 'year' => '2025', 'month' => '10', 'day' => '29', ]

На самом деле в массиве с результатом значения карманов будут доступны как по имени, так и по порядковому номеру. То есть, к примеру, год будет доступен по ключу 'year' и по номеру 1, месяц - по ключу 'month' и по номеру 2 и так далее:

[ 'year' => '2025', 'month' => '10', 'day' => '29', 1 => '2025', 2 => '10', 3 => '29' ]

Дана строка со временем:

<?php $str = '12:59:59'; ?>

Положите часы, минуты и секунды в отдельные именованные карманы.

Напишите функцию, которая в массиве с результатом удалит все нумерованные карманы, оставив только именованные.

Альтернативный синтаксис

Можно также использовать синтаксис (?P<name>pattern):

<?php $reg = '#(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})#'; ?>

Доступен также синтаксис (?'name'pattern). Он более короткий, однако, внешние кавычки регулярного выражение придется сделать двойными, чтобы не было конфликта:

<?php $reg = "#(?'year'\d{4})-(?'month'\d{2})-(?'day'\d{2})#"; ?>