Poches nommées dans les expressions régulières PHP
Supposons qu'avec preg_match nous voulions
décomposer une date en jour, mois et année. Utilisons
pour cela des poches :
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // affichera ['2025-10-29', '2025', '10', '29']
?>
Comme vous le voyez, dans le résultat nous obtenons un tableau, dans lequel dans l'élément zéro sera la date entière, dans le premier - l'année, dans le deuxième - le mois, dans le troisième - le jour.
Parfois, cependant, il serait pratique d'obtenir le contenu des poches sous forme de tableau associatif. C'est-à-dire dans notre cas, il serait bien d'obtenir un tableau comme celui-ci :
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Pour cela, il existe une syntaxe spéciale
dans les expressions régulières. La voici : (?<name>pattern),
où pattern - est l'expression régulière, et name
- est le nom de la poche.
Réécrivons notre expression régulière pour la date avec des poches nommées :
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
En conséquence, nous obtiendrons un tableau associatif, dans lequel les clés seront les noms des poches, et les valeurs - ce qui y est entré :
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
En réalité, dans le tableau de résultat, les valeurs
des poches seront accessibles à la fois par leur nom et
par leur numéro d'ordre. C'est-à-dire, par exemple,
l'année sera accessible par la clé 'year'
et par le numéro 1, le mois - par la clé 'month'
et par le numéro 2 et ainsi de suite :
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Les poches nommées décrites ont encore quelques
syntaxes alternatives : (?P<name>pattern)
et (?'name'pattern).
Une chaîne avec l'heure est donnée :
<?php
$str = '12:59:59';
?>
Placez les heures, les minutes et les secondes dans des poches nommées distinctes.
Écrivez une fonction qui, dans le tableau de résultat, supprimera toutes les poches numérotées, en ne laissant que les poches nommées.