Nezachytávajúce zátvorky v regulárnych výrazoch PHP
Zátvorky () plnia dve funkcie -
zoskupovanie znakov a funkciu zachytenia (tzv. pocket). A
čo robiť, ak potrebujeme zoskupiť,
ale nechceme zachytiť?
Na vyriešenie tohto problému boli vytvorené špeciálne
nezachytávajúce zátvorky (?: )
- tie zoskupujú, ale nezachytávajú do pocket.
Príklad
V nasledujúcom príklade potrebujeme prvé zátvorky pre zoskupenie a druhé - pre zachytenie. Avšak, oboje zátvorky ukladajú údaje do pocket:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
V dôsledku toho budeme mať v našich pocketoch nasledovné:
<?php
var_dump($res[0]); // vypíše 'abab123'
var_dump($res[1]); // vypíše 'ab'
var_dump($res[2]); // vypíše '123'
?>
Príklad
Urobme tak, aby prvá dvojica zátvoriek iba zoskupovala, ale nezachytávala do pocket:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
V dôsledku toho bude v našom prvom pocket naše číslo:
<?php
var_dump($res[1]); // vypíše '123'
?>
Praktické úlohy
Sú dané podreťazce, rozdelené na dve časti
ľubovoľným počtom párov $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Nájdite každý z takýchto podreťazcov a pre každý nájdený podreťazec vložte do prvého pocket to, čo je pred oddeľovačom, a do druhého pocket - to, čo je za oddeľovačom.