Número geral de grupos de captura em expressões regulares do PHP
Vamos considerar a seguinte situação. Suponha que temos
uma variável com um ano, que pode variar
de 1990 a 2099.
Suponha que queremos obter os dois últimos dígitos
do ano em um grupo de captura. Vamos escrever a expressão regular correspondente:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
No entanto, há uma inconveniência nos aguardando aqui. O problema é que, para os anos do século passado, os dois dígitos cairão no primeiro grupo de captura, enquanto para os anos do século seguinte - no segundo. Vamos ver com exemplos.
Aqui está a primeira variante:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
E aqui está a segunda variante:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Suponha agora que queremos salvar os dígitos encontrados do ano em uma variável. Temos um problema, pois não sabemos exatamente com qual chave recuperar os dados do grupo de captura:
<?php
$year = $res[1]; // precisa da chave 1 ou 2
?>
É possível resolver o problema com uma condição:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
No entanto, existe uma solução mais simples. Podemos usar
um comando especial (?| ). Todos os grupos de captura
que estiverem dentro dele terão
o mesmo número.
Vamos corrigir nossa expressão regular
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
E agora nosso ano certamente estará no grupo de captura número um:
<?php
$year = $res[1];
?>
São dadas strings com datas, nas quais o ano pode
variar de 1990 a 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Para cada data, coloque o dia no primeiro grupo de captura, o mês no segundo, e os dois últimos dígitos do ano - no terceiro.