Именувани групи во регуларните изрази во 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

Напишете функција, која во низата со резултат ќе ги избрише сите нумерирани групи, оставајќи само именуваните.