Parentesi non catturanti nelle espressioni regolari di PHP
Le parentesi () svolgono due funzioni:
raggruppare i caratteri e la funzione di cattura (capturing group).
Ma cosa fare se abbiamo bisogno di raggruppare,
senza però catturare nel gruppo?
Per risolvere questo problema sono state create delle speciali
parentesi non catturanti (?: )
- che raggruppano, ma non catturano nel gruppo.
Esempio
Nel seguente esempio, le prime parentesi ci servono per il raggruppamento, mentre le seconde per la cattura. Tuttavia, entrambe le parentesi catturano i dati nel gruppo:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Di conseguenza, nei nostri gruppi di cattura avremo quanto segue:
<?php
var_dump($res[0]); // visualizzerà 'abab123'
var_dump($res[1]); // visualizzerà 'ab'
var_dump($res[2]); // visualizzerà '123'
?>
Esempio
Modifichiamo in modo che la prima coppia di parentesi solo raggruppi, senza catturare nel gruppo:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Di conseguenza, nel primo gruppo di cattura ci sarà il nostro numero:
<?php
var_dump($res[1]); // visualizzerà '123'
?>
Compiti pratici
Sono date delle sottostringhe, divise in due parti
da un numero arbitrario di coppie $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Trova ognuna di queste sottostringhe e per ogni sottostringa trovata, metti nel primo gruppo di cattura ciò che sta prima del separatore, e nel secondo gruppo di cattura - ciò che sta dopo il separatore.