Ikke-opbevarende parenteser i PHP regulære udtryk

Parenteser () udfører to funktioner - gruppering af tegn og capture group funktion. Men hvad gør vi, hvis vi har brug for at gruppere, men ikke gemme i capture groups? Til at løse dette problem er der specielle ikke-opbevarende parenteser (?: ) - de grupperer, men gemmer ikke i capture groups.

Eksempel

I det følgende eksempel har vi brug for de første parenteser til gruppering, og de anden - til capture group. Dog gemmer begge typer parenteser data i capture groups:

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

Som et resultat vil vores capture groups indeholde følgende:

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

Eksempel

Lad os gøre sådan, at det første par parenteser kun grupperer, men ikke gemmer i capture groups:

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

Som et resultat vil vores tal være i den første capture group:

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

Praktiske opgaver

Задание 1

Der er givet understrenge, opdelt i to dele af et vilkårligt antal par $@:

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

Find hver af sådanne understrenge og for hver fundet understreng, læg i den første capture group det, der står før separator, og i den anden capture group - det, der står efter separator.