Nie-bewarende hakies in PHP gereelde uitdrukkings

Hakies () vervul twee funksies - groepering van karakters en die funksie van 'n sak. En wat om te doen as ons moet groepeer, maar nie in die sak plaas nie? Vir die oplossing van so 'n probleem is spesiale nie-bewarende hakies (?: ) uitgedink - hulle groepeer, maar plaas nie in die sak nie.

Voorbeeld

In die volgende voorbeeld het ons die eerste hakies nodig vir groepering, en die tweede - vir die sak. Maar, beide hakies bewaar data in die sak:

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

As gevolg sal die volgende in ons sakke wees:

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

Voorbeeld

Laat ons dit so maak dat die eerste paar hakies slegs groepeer, maar nie in die sak plaas nie:

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

As gevolg sal ons nommer in die eerste sak wees:

php<?php
  var_dump($res[1]); // sal '123' uitvoer
?>

Praktiese take

Задание 1

Gegee substringe, verdeel in twee dele deur 'n willekeurige aantal pare $@:

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

Vind elk van sulke substringe en vir elke gevonde substring plaas in die eerste sak wat voor die skeier staan, en in die tweede sak - wat na die skeier staan.