Незахоўвальныя дужкі ў рэгулярках PHP
Дужкі ()
выконваюць дзве функцыі -
групоўку сімвалаў і функцыю кішэні. А
што рабіць, калі нам трэба згрупаваць,
але ў кішэню не класці?
Для вырашэння такой праблемы прыдуманы спецыяльныя
незахоўвальныя дужкі (?: )
- яны групуюць, але не кладуць у кішэню.
Прыклад
У наступным прыкладзе першыя дужкі нам патрэбныя для групоўкі, а другія - для кішэні. Аднак, і тыя, і іншыя дужкі захоўваюць дадзеныя ў кішэню:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
У выніку ў нашых кішэнях будзе наступнае:
<?php
var_dump($res[0]); // выведзе 'abab123'
var_dump($res[1]); // выведзе 'ab'
var_dump($res[2]); // выведзе '123'
?>
Прыклад
Зробім так, каб першая пара дужак толькі групавала, але не клала ў кішэню:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
У выніку ў першай кішэні будзе наша лік:
<?php
var_dump($res[1]); // выведзе '123'
?>
Практычныя задачы
Дадзены падрадкі, падзеленыя на дзве часткі
адвольная колькасцю пар $@
:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Знайдзіце кожную з такіх падрадкаў і для кожнай знойдзенай падрадкі пакладзеце ў першую кішэню тое, што стаіць да падзельніка, а ў другую кішэню - тое, што стаіць пасля падзельніка.