Ikke-fangende parenteser i PHP regex
Parenteser () utfører to funksjoner -
gruppering av tegn og fangstfunksjon. Men
hva gjør vi hvis vi trenger å gruppere,
uten å fange?
For å løse dette problemet er det spesielle
ikke-fangende parenteser (?: )
utviklet - de grupperer, men fanger ikke.
Eksempel
I det følgende eksemplet trenger vi de første parentesene for gruppering, og de andre - for fangst. Imidlertid fanger begge typer parenteser data i fangstgrupper:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Som et resultat vil følgende være i våre fangstgrupper:
<?php
var_dump($res[0]); // vil skrive ut 'abab123'
var_dump($res[1]); // vil skrive ut 'ab'
var_dump($res[2]); // vil skrive ut '123'
?>
Eksempel
La oss gjøre slik at det første paret med parenteser bare grupperer, men ikke fanger:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Som et resultat vil tallet vårt være i den første fangstgruppen:
<?php
var_dump($res[1]); // vil skrive ut '123'
?>
Praktiske oppgaver
Gitt delstrenger, delt inn i to deler
av et vilkårlig antall par med $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Finn hver av slike delstrenger og for hver funnet delstreng, plasser i den første fangstgruppen det som står før skilletegnet, og i den andre fangstgruppen - det som står etter skilletegnet.