Nezachytávající závorky v regulárních výrazech PHP
Závorky () plní dvě funkce -
seskupování znaků a funkci zachytávání. A
co dělat, když potřebujeme seskupit,
ale nezachytávat?
Pro řešení tohoto problému byly vytvořeny speciální
nezachytávající závorky (?: )
- seskupují, ale nezachytávají.
Příklad
V následujícím příkladu první závorky potřebujeme pro seskupení, a druhé - pro zachytávání. Avšak oboje závorky ukládají data do zachytávacích skupin:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
V důsledku budou naše zachytávací skupiny obsahovat následující:
<?php
var_dump($res[0]); // vypíše 'abab123'
var_dump($res[1]); // vypíše 'ab'
var_dump($res[2]); // vypíše '123'
?>
Příklad
Upravme to tak, aby první pár závorek pouze seskupoval, ale nezachytával:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
V důsledku bude v první zachytávací skupině naše číslo:
<?php
var_dump($res[1]); // vypíše '123'
?>
Praktické úlohy
Jsou dány podřetězce, rozdělené na dvě části
libovolným počtem párů $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Najděte každý z těchto podřetězců a pro každý nalezený podřetězec vložte do první zachytávací skupiny to, co je před oddělovačem, a do druhé zachytávací skupiny - to, co je za oddělovačem.