Іменаваныя карманы ў рэгулярках 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']
?>

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

Часам, аднак, было б зручна атрымаць змесціва карманаў у выглядзе асацыятыўнага масіва. Гэта значыць у нашым выпадку было б добра атрымаць вось такі масіў:

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',
]

На самай справе ў масіве з вынікам значэнні карманаў будуць даступныя як па імі, так і па парадкавым нумары. Гэта значыць, напрыклад, год будзе даступны па ключы '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

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