Nesaugančios skliaustelės PHP reguliariosiose išraiškose

Skliausteliuose () atliekamos dvi funkcijos - symbolių grupavimas ir kišenės funkcija. O ką daryti, jei mums reikia sugrupuoti, bet nedėti į kišenę? Norint išspręsti tokią problemą, buvo sugalvoti specialūs nesaugantys skliausteliai (?: ) - jie grupuoja, bet nededa į kišenę.

Pavyzdys

Šiame pavyzdyje pirmieji skliausteliai mums reikalingi grupavimui, o antrieji - kišenei. Tačiau ir tie, ir tie skliausteliai išsaugo duomenis į kišenę:

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

Dėl to mūsų kišenėse bus taip:

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

Pavyzdys

Padarykime taip, kad pirmoji skliaustelių pora tik grupuotų, bet nedėtų į kišenę:

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

Dėl to pirmoje kišenėje bus mūsų skaičius:

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

Praktinės užduotys

Задание 1

Duoti poeiliai, suskirstyti į dvi dalis savavališku $@ porų skaičiumi:

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

Raskite kiekvieną iš tokių poeilių ir kiekvienam rastam poeliui į pirmąją kišenę įdėkite tai, kas yra prieš skirstytuvą, o į antrąją kišenę - tai, kas yra po skirstytuvo.