Poimenovani zajeti v regularnih izrazih PHP

Recimo, da želimo z preg_match razbiti datum na dan, mesec in leto. Uporabimo za to zajete:

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

Kot vidite, kot rezultat dobimo matriko, v kateri bo na ničelnem elementu celoten datum, na prvem - leto, na drugem - mesec, na tretjem - dan.

Včasih pa bi bilo priročno dobiti vsebino zajetih kot asociativno matriko. Se prav v našem primeru bi bilo dobro dobiti takšno matriko:

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

Za to v regularnih izrazih obstaja posebna sintaksa. Tukaj je: (?<name>pattern), kjer je pattern - regularni izraz, name pa je ime zajeta.

Prepišimo naš regularni izraz za datum z uporabo poimenovanih zajetov:

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

Kot rezultat bomo dobili asociativno matriko, v kateri bodo ključi imena zajetov, vrednosti pa - kar se je ujelo vanje:

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

Pravzaprav bodo v matriki z rezultatom vrednosti zajetov dostopne tako po imenu kot po zaporedni številki. Se pravi, na primer, leto bo dostopno po ključu 'year' in po številki 1, mesec - po ključu 'month' in po številki 2 in tako naprej:

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

Opisani poimenovani zajeti imajo še nekaj alternativnih sintaks: (?P<name>pattern) in (?'name'pattern).

Задание 1

Podan je niz s časom:

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

Postavite ure, minute in sekunde v ločene poimenovane zajete.

Задание 2

Napišite funkcijo, ki bo v matriki z rezultatom izbrisala vsa oštevilčena zajeta, pustila pa samo poimenovana.