Именованные карманы в регулярках 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'
]
Описанные именованные карманы имеют еще несколько
альтернативных синтаксисов: (?P<name>pattern)
и (?'name'pattern).
Дана строка со временем:
<?php
$str = '12:59:59';
?>
Положите часы, минуты и секунды в отдельные именованные карманы.
Напишите функцию, которая в массиве с результатом удалит все нумерованные карманы, оставив только именованные.