Pomenované zachytávacie skupiny v regulárnych výrazoch PHP

Povedzme, že pomocou preg_match chceme rozdeliť dátum na deň, mesiac a rok. Použime na to zachytávacie skupiny:

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

Ako vidíte, vo výsledku dostaneme pole, v ktorom v nultom prvku bude celý dátum, v prvom - rok, v druhom - mesiac, v treťom - deň.

Niekedy by však bolo vhodné získať obsah zachytávacích skupín vo forme asociatívneho poľa. To znamená, že v našom prípade by bolo fajn získať takéto pole:

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

Na to v regulárnych výrazoch existuje špeciálna syntax. Tu je: (?<name>pattern), kde pattern - je regulárny výraz, a name - je názov zachytávacej skupiny.

Prepíšme náš regulárny výraz pre dátum pomocou pomenovaných zachytávacích skupín:

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

Výsledkom bude asociatívne pole, v ktorom kľúče budú mená zachytávacích skupín, a hodnoty - to, čo sa do nich dostalo:

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

V skutočnosti budú hodnoty zachytávacích skupín v poli s výsledkom dostupné ako podľa mena, tak a podľa poradového čísla. To znamená, že napríklad rok bude dostupný pod kľúčom 'year' a pod číslom 1, mesiac - pod kľúčom 'month' a pod číslom 2 a tak ďalej:

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

Opísané pomenované zachytávacie skupiny majú ešte niekoľko alternatívnych syntaxí: (?P<name>pattern) a (?'name'pattern).

Задание 1

Daný reťazec s časom:

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

Uložte hodiny, minúty a sekundy do samostatných pomenovaných zachytávacích skupín.

Задание 2

Napíšte funkciu, ktorá v poli s výsledkom odstráni všetky číslované zachytávacie skupiny, pričom ponechá iba pomenované.