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<?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<?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<?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<?php
  var_dump($res[1]); // vypíše '123'
?>

Praktické úlohy

Задание 1

Sú dané podreťazce, rozdelené na dve časti ľubovoľným počtom párov $@:

php<?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.