Nesaglabājošās iekavas PHP regulārajās izteiksmēs

Iekavas () veic divas funkcijas - simbolu grupēšanu un capture funkciju. Bet ko darīt, ja mums ir nepieciešams grupēt, bet neielikt capture? Šādas problēmas risināšanai tika izgudrotas speciālas nesaglabājošās iekavas (?: ) - tās grupē, bet neieliek capture.

Piemērs

Nākamajā piemērā pirmās iekavas mums vajadzīgas grupēšanai, bet otrajās - capture. Tomēr gan vienas, gan otras iekavas saglabā datus capture:

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

Rezultātā mūsu capture būs sekojošais:

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

Piemērs

Padarīsim tā, lai pirmā iekavu pāris tikai grupētu, bet neieliktu capture:

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

Rezultātā pirmajā capture būs mūsu skaitlis:

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

Praktiskie uzdevumi

Задание 1

Dotas apakšvirknes, sadalītas divās daļās ar patvaļīgu $@ pāru daudzumu:

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

Atrodiet katru no šādām apakšvirknēm un katrai atrastajai apakšvirknei ievietojiet pirmajā capture to, kas atrodas pirms atdalītāja, bet otrajā capture - to, kas atrodas aiz atdalītāja.