Parênteses não capturadores em expressões regulares do PHP
Os parênteses () desempenham duas funções -
agrupamento de caracteres e a função de captura (grupo de captura). E
o que fazer se precisamos agrupar,
mas não capturar?
Para resolver esse problema, foram criados os
parênteses não capturadores (?: )
- eles agrupam, mas não capturam.
Exemplo
No exemplo a seguir, os primeiros parênteses são necessários para agrupamento, e os segundos - para captura. No entanto, ambos os tipos de parênteses salvam dados em grupos de captura:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Como resultado, nossos grupos de captura terão o seguinte:
<?php
var_dump($res[0]); // exibirá 'abab123'
var_dump($res[1]); // exibirá 'ab'
var_dump($res[2]); // exibirá '123'
?>
Exemplo
Vamos fazer com que o primeiro par de parênteses apenas agrupe, mas não capture:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Como resultado, nosso número estará no primeiro grupo de captura:
<?php
var_dump($res[1]); // exibirá '123'
?>
Tarefas práticas
Dadas as substrings, divididas em duas partes
por uma quantidade arbitrária de pares $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Encontre cada uma dessas substrings e para cada substring encontrada, coloque no primeiro grupo de captura o que vem antes do separador, e no segundo grupo de captura - o que vem depois do separador.