Пусть с помощью 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})#";
?>