Neohranjevalni oklepaji v regularnih izrazih PHP

Oklepaji () opravljajo dve funkciji - grupiranje znakov in funkcijo zajema (capturing). Kaj pa narediti, če želimo grupirati, a ne zajeti v skupino? Za rešitev tega problema so bili izumljeni posebni neohranjevalni oklepaji (?: ) - ti grupirajo, vendar ne zajamejo v skupino.

Primer

V naslednjem primeru prvi oklepaji so potrebni za grupiranje, drugi pa za zajem. Vendar, obe vrsti oklepajev shranijo podatke v zajem:

php<?php
  $str = 'abab123';
  $reg = '#(ab)+([1-9]+)#';
  preg_match_all($reg, $str, $res);
?>

Kot rezultat bo v naših zajemih naslednje:

php<?php
  var_dump($res[0]); // izpiše 'abab123'
  var_dump($res[1]); // izpiše 'ab'
  var_dump($res[2]); // izpiše '123'
?>

Primer

Naredimo tako, da bo prvi par oklepajev le grupiral, ne pa tudi zajel v skupino:

php<?php
  $str = 'abab123';
  $reg = '#(?:ab)+([1-9]+)#';
  preg_match_all($reg, $str, $res);
?>

Kot rezultat bo v prvem zajemu naša številka:

php<?php
  var_dump($res[1]); // izpiše '123'
?>

Praktične naloge

Задание 1

Dane so podnize, razdeljene na dva dela poljubno količino parov $@:

php<?php
  $str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>

Poiščite vsako od takih podnizov in za vsako našto podniz v prvi zajem postavite tisto, kar je pred ločilom, v drugi zajem pa - tisto, kar je za ločilom.