Ei-capture-sulkeet PHP:n säännöllisissä lausekkeissa

Sulkeet () suorittavat kaksi tehtävää - merkkien ryhmittely ja capturen tehtävä. Mutta mitä tehdä, jos haluamme ryhmitellä, mutta emme tallentaa captureen? Tämän ongelman ratkaisemiseksi on keksitty erityiset ei-capture-sulkeet (?: ) - ne ryhmittelevät, mutta eivät tallenna captureen.

Esimerkki

Seuraavassa esimerkissä ensimmäiset sulkeet tarvitsemme ryhmittelyyn, ja toiset - captureen. Kuitenkin sekä nämä että nuo sulkeet tallentavat tiedot captureen:

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

Tuloksena captureissamme on seuraavaa:

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

Esimerkki

Tehdään niin, että ensimmäinen sulkepari vain ryhmittelee, mutta ei tallenna captureen:

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

Tuloksena ensimmäisessä capturessa on numeromme:

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

Käytännön tehtävät

Задание 1

Annettu alimerkkijonoja, jaettu kahteen osaan mielivaltaisella määrällä $@ -pareja:

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

Etsi jokainen tällainen alimerkkijono ja jokaiselle löydetylle alimerkkijonolle aseta ensimmäiseen captureen se, mikä on ennen erotinta, ja toiseen captureen - se, mikä on erottimen jälkeen.