Nepamteće zagrade u regularnim izrazima PHP
Zagrade () obavljaju dve funkcije -
grupisanje simbola i funkciju capture grupe. A
šta raditi ako treba da grupišemo,
ali ne želimo da stavimo u capture grupu?
Za rešavanje ovog problema smišljene su specijalne
nepamteće zagrade (?: )
- one grupišu, ali ne smeštaju u capture grupu.
Primer
U sledećem primeru prve zagrade su nam potrebne za grupisanje, a druge - za capture grupu. Međutim, i jedne i druge zagrade pamte podatke u capture grupu:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Kao rezultat, u našim capture grupama će biti sledeće:
<?php
var_dump($res[0]); // ispisaće 'abab123'
var_dump($res[1]); // ispisaće 'ab'
var_dump($res[2]); // ispisaće '123'
?>
Primer
Učinimo da prvi par zagrada samo grupise, ali ne stavlja u capture grupu:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Kao rezultat, u prvoj capture grupi će biti naš broj:
<?php
var_dump($res[1]); // ispisaće '123'
?>
Praktični zadaci
Date su podniske, podeljene na dva dela
proizvoljnim brojem parova $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Pronađite svaku od ovih podniski i za svaku pronađenu podnisku stavite u prvu capture grupu ono što stoji pre razdvajača, a u drugu capture grupu - ono što stoji posle razdvajača.