PHP-ի ռեգուլյար արտահայտություններում չպահպանող փակագծեր

() փակագծերը կատարում են երկու ֆունկցիա - նիշերի խմբավորում և «գրպանի» ֆունկցիա: Իսկ ի՞նչ անել, եթե մեզ անհրաժեշտ է խմբավորել, բայց չդնել գրպանում: Այսպիսի խնդիրը լուծելու համար ստեղծվել են հատուկ չպահպանող փակագծեր (?: ) - դրանք խմբավորում են, բայց չեն դնում գրպանում:

Օրինակ

Հաջորդ օրինակում առաջին փակագծերը մեզ անհրաժեշտ են խմբավորման համար, իսկ երկրորդները՝ գրպանի համար: Սակայն, և՛ առաջին, և՛ երկրորդ փակագծերը պահպանում են տվյալները գրպանում:

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

Արդյունքում մեր գրպաններում կլինի հետևյալը.

php<?php
  var_dump($res[0]); // կարտածի 'abab123'
  var_dump($res[1]); // կարտածի 'ab'
  var_dump($res[2]); // կարտածի '123'
?>

Օրինակ

Եկեք անենք, որ առաջին զույգ փակագծերը միայն խմբավորեն, բայց չդնեն գրպանում.

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

Արդյունքում առաջին գրպանում կլինի մեր թիվը.

php<?php
  var_dump($res[1]); // կարտածի '123'
?>

Գործնական առաջադրանքներ

Задание 1

Տրված են ենթատողեր, բաժանված երկու մասի $@ զույգերի կամայական քանակով.

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

Գտեք յուրաքանչյուր այդպիսի ենթատող և յուրաքանչյուր գտնված ենթատողի համար առաջին գրպանում դրեք այն, ինչ կա բաժանարարից առաջ, իսկ երկրորդ գրպանում՝ այն, ինչ կա բաժանարարից հետո: