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
$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:
[
'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
$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:
[
'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:
[
'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).
Data una stringa con un orario:
<?php
$str = '12:59:59';
?>
Inserisci ore, minuti e secondi in gruppi con nome separati.
Scrivi una funzione che, nell'array risultato, rimuova tutti i gruppi numerati, lasciando solo quelli con nome.