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
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Dėl to mūsų kišenėse bus taip:
<?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
$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
var_dump($res[1]); // išves '123'
?>
Praktinės užduotys
Duoti poeiliai, suskirstyti į dvi dalis
savavališku $@ porų skaičiumi:
<?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.