Ikke-opbevarende parenteser i PHP regulære udtryk
Parenteser () udfører to funktioner -
gruppering af tegn og capture group funktion. Men
hvad gør vi, hvis vi har brug for at gruppere,
men ikke gemme i capture groups?
Til at løse dette problem er der specielle
ikke-opbevarende parenteser (?: )
- de grupperer, men gemmer ikke i capture groups.
Eksempel
I det følgende eksempel har vi brug for de første parenteser til gruppering, og de anden - til capture group. Dog gemmer begge typer parenteser data i capture groups:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Som et resultat vil vores capture groups indeholde følgende:
<?php
var_dump($res[0]); // vil udskrive 'abab123'
var_dump($res[1]); // vil udskrive 'ab'
var_dump($res[2]); // vil udskrive '123'
?>
Eksempel
Lad os gøre sådan, at det første par parenteser kun grupperer, men ikke gemmer i capture groups:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Som et resultat vil vores tal være i den første capture group:
<?php
var_dump($res[1]); // vil udskrive '123'
?>
Praktiske opgaver
Der er givet understrenge, opdelt i to dele
af et vilkårligt antal par $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Find hver af sådanne understrenge og for hver fundet understreng, læg i den første capture group det, der står før separator, og i den anden capture group - det, der står efter separator.