Gruppi con nome nelle espressioni regolari di PHP

Supponiamo di voler scomporre una data in giorno, mese e anno utilizzando preg_match. Useremo a questo scopo i gruppi di cattura:

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

Come puoi vedere, il risultato è un array in cui l'elemento con indice zero contiene l'intera data, il primo l'anno, il secondo il mese, il terzo il giorno.

A volte, tuttavia, sarebbe comodo ottenere il contenuto dei gruppi sotto forma di array associativo. Cioè, nel nostro caso, sarebbe bello ottenere un array come questo:

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

A questo scopo, nelle espressioni regolari esiste una sintassi speciale. Eccola: (?<name>pattern), dove pattern è l'espressione regolare, e name è il nome del gruppo.

Riscriviamo la nostra espressione regolare per la data utilizzando i gruppi con nome:

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

Il risultato sarà un array associativo in cui le chiavi sono i nomi dei gruppi, e i valori sono il loro contenuto:

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

In realtà, nell'array risultante, i valori dei gruppi saranno accessibili sia per nome che per numero d'ordine. Cioè, ad esempio, l'anno sarà accessibile con la chiave 'year' e con il numero 1, il mese con la chiave 'month' e con il numero 2 e così via:

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

I gruppi con nome descritti hanno anche alcune sintassi alternative: (?P<name>pattern) e (?'name'pattern).

Задание 1

Data una stringa con un orario:

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

Inserisci ore, minuti e secondi in gruppi con nome separati.

Задание 2

Scrivi una funzione che, nell'array risultato, rimuova tutti i gruppi numerati, lasciando solo quelli con nome.