Bolsillos con nombre en expresiones regulares de PHP
Supongamos que queremos usar preg_match para
dividir una fecha en día, mes y año. Usemos
para ello bolsillos:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // mostrará ['2025-10-29', '2025', '10', '29']
?>
Como puedes ver, como resultado obtenemos un array, en el cual en el elemento cero estará la fecha completa, en el primero - el año, en el segundo - el mes, en el tercero - el día.
Sin embargo, a veces sería conveniente obtener el contenido de los bolsillos en forma de array asociativo. Es decir, en nuestro caso estaría bien obtener un array como este:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Para ello, en las expresiones regulares existe una sintaxis
especial. Esta es: (?<name>pattern),
donde pattern - es la expresión regular, y name
- es el nombre del bolsillo.
Reescribamos nuestra expresión regular para la fecha usando bolsillos con nombre:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Como resultado, obtendremos un array asociativo, en el cual las claves serán los nombres de los bolsillos, y los valores - lo que coincidió en ellos:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
En realidad, en el array con el resultado, los valores
de los bolsillos estarán disponibles tanto por nombre
como por número de orden. Es decir, por ejemplo,
el año estará disponible por la clave 'year'
y por el número 1, el mes - por la clave 'month'
y por el número 2 y así sucesivamente:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Los bolsillos con nombre descritos tienen además varias
sintaxis alternativas: (?P<name>pattern)
y (?'name'pattern).
Se da una cadena con una hora:
<?php
$str = '12:59:59';
?>
Coloque las horas, minutos y segundos en bolsillos con nombre separados.
Escriba una función que, en el array con el resultado, elimine todos los bolsillos numerados, dejando solo los bolsillos con nombre.