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

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

php<?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']
?>

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

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

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

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

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

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

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

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

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

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

Описанные именованные карманы имеют еще несколько альтернативных синтаксисов: (?P<name>pattern) и (?'name'pattern).

Задание 1

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

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

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

Задание 2

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