Número general de grupos en expresiones regulares de PHP
Consideremos la siguiente situación. Supongamos que tenemos
una variable con un año, que puede variar
de 1990 a 2099.
Supongamos que queremos obtener los dos últimos dígitos
del año en un grupo. Escribamos la expresión regular correspondiente:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Sin embargo, aquí nos espera un inconveniente. El problema es que para los años del siglo pasado, los dos dígitos caerán en el primer grupo, mientras que para los años del siglo siguiente - en el segundo. Veámoslo con ejemplos.
He aquí la primera opción:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Y he aquí la segunda opción:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Ahora supongamos que queremos guardar los dígitos del año encontrados en una variable. Nos espera un problema, ya que no sabemos con exactitud con qué clave tomar los datos del grupo:
<?php
$year = $res[1]; // se necesita la clave 1 o 2
?>
Se puede resolver el problema mediante una condición:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Sin embargo, existe una solución más simple. Se puede usar
el comando especial (?| ). Todos los grupos
que se encuentren dentro de ella tendrán
el mismo número.
Arreglemos nuestra expresión regular
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Y ahora nuestro año estará definitivamente en el grupo número uno:
<?php
$year = $res[1];
?>
Se dan cadenas con fechas, en las que el año puede
variar de 1990 a 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Para cada fecha, guarde el día en el primer grupo, el mes en el segundo, y los dos últimos dígitos del año - en el tercero.