Numéro général des groupes de capture dans les regex PHP
Considérons la situation suivante. Supposons que nous ayons
une variable avec une année, qui peut varier
de 1990 à 2099.
Supposons que nous voulions récupérer les deux derniers chiffres
de l'année dans un groupe de capture. Écrivons l'expression régulière correspondante :
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Cependant, nous rencontrons ici un inconvénient. Le fait est que pour les années du siècle dernier, les deux chiffres iront dans le premier groupe de capture, tandis que pour les années du siècle suivant - dans le second. Regardons avec des exemples.
Voici le premier cas :
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Et voici le second cas :
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Supposons maintenant que nous voulions enregistrer les chiffres trouvés de l'année dans une variable. Nous rencontrons un problème, car nous ne savons pas exactement avec quelle clé récupérer les données du groupe de capture :
<?php
$year = $res[1]; // besoin de la clé 1 ou 2
?>
On peut résoudre le problème avec une condition :
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Cependant, il existe une solution plus simple. On peut utiliser
la commande spéciale (?| ). Tous les groupes de capture
qui se trouvent à l'intérieur auront
le même numéro.
Corrigeons notre expression régulière
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Et maintenant notre année sera certainement dans le groupe de capture numéro un :
<?php
$year = $res[1];
?>
Voici des chaînes de caractères avec des dates, dans lesquelles l'année peut
varier de 1990 à 2099 :
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Pour chaque date, placez le jour dans le premier groupe de capture, le mois dans le second, et les deux derniers chiffres de l'année - dans le troisième.