Nem rögzítő zárójelek a PHP reguláris kifejezéseiben

A () zárójelek két funkciót töltenek be - a karakterek csoportosítását és a zseb funkciót. De mit tegyünk, ha csoportosítanunk kell, de nem akarunk a zsebbe helyezni? Ennek a problémának a megoldására találták ki a speciális nem rögzítő zárójeleket (?: ) - ezek csoportosítanak, de nem helyeznek a zsebbe.

Példa

A következő példában az első zárójelek a csoportosításhoz szükségesek, a másodikak pedig a zsebhez. Azonban mindkét zárójel típus elhelyezi az adatokat a zsebben:

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

Ennek eredményeként a zsebeinkben a következő lesz:

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

Példa

Tegyük úgy, hogy az első zárójelpár csak csoportosítson, de ne helyezzen a zsebbe:

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

Ennek eredményeként az első zsebben a számunk lesz:

php<?php
  var_dump($res[1]); // kiírja '123'
?>

Gyakorlati feladatok

Задание 1

Adottak részsztringek, kettéosztva tetszőleges számú $@ párral:

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

Keresse meg mindegyik ilyen részsztringet és mindegyik megtalált részsztring esetén helyezze az első zsebbe az elválasztó előtti részt, a második zsebbe pedig az elválasztó utáni részt.