Nazwane kieszenie w wyrażeniach regularnych PHP

Załóżmy, że za pomocą preg_match chcemy rozbić datę na dzień, miesiąc i rok. Użyjemy do tego kieszeni:

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

Jak widzicie, w wyniku otrzymujemy tablicę, w której w zerowym elemencie będzie cała data, w pierwszym - rok, w drugim - miesiąc, w trzecim - dzień.

Czasami jednak byłoby wygodnie otrzymać zawartość kieszeni w postaci tablicy asocjacyjnej. To znaczy w naszym przypadku byłoby nieźle dostać taką tablicę:

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

W tym celu w wyrażeniach regularnych istnieje specjalna składnia. Oto ona: (?<name>pattern), gdzie pattern - to wyrażenie regularne, a name - to nazwa kieszeni.

Przepiszmy nasze wyrażenie regularne dla daty przez nazwane kieszenie:

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

W rezultacie otrzymamy tablicę asocjacyjną, w której kluczami będą nazwy kieszeni, a wartościami - to, co się w nich znalazło:

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

W rzeczywistości w tablicy z wynikiem wartości kieszeni będą dostępne zarówno po nazwie, jak i po numerze porządkowym. To znaczy, na przykład, rok będzie dostępny po kluczu 'year' i po numerze 1, miesiąc - po kluczu 'month' i po numerze 2 i tak dalej:

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

Opisane nazwane kieszenie mają jeszcze kilka alternatywnych składni: (?P<name>pattern) i (?'name'pattern).

Задание 1

Dany jest ciąg znaków z czasem:

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

Umieść godziny, minuty i sekundy w oddzielnych nazwanych kieszeniach.

Задание 2

Napisz funkcję, która w tablicy z wynikiem usunie wszystkie ponumerowane kieszenie, pozostawiając tylko nazwane.