Kllapat që nuk ruajnë në regex të PHP
Kllapat () kryejnë dy funksione -
grupimin e karaktereve dhe funksionin e kaptësit (capturing group). Po
çfarë duhet bërë nëse ne kemi nevojë të grupojmë,
por jo për të futur në kaptës?
Për zgjidhjen e këtij problemi janë krijuar
kllapat që nuk ruajnë (?: )
- ato grupojnë, por nuk e vendosin në kaptës.
Shembull
Në shembullin vijues kllapat e para na duhen për grupim, kurse të dytat - për kaptës. Megjithatë, të dyja llojet e kllapave ruajnë të dhëna në kaptës:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Si rezultat në kaptësat tanë do të ketë si më poshtë:
<?php
var_dump($res[0]); // do të nxjerrë 'abab123'
var_dump($res[1]); // do të nxjerrë 'ab'
var_dump($res[2]); // do të nxjerrë '123'
?>
Shembull
Le t'i bëjmë që çifti i parë i kllapave vetëm të grupojë, por të mos vendosë në kaptës:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Si rezultat në kaptësin e parë do të jetë numri ynë:
<?php
var_dump($res[1]); // do të nxjerrë '123'
?>
Detyra praktike
Jepen nënvargjet, të ndara në dy pjesë
nga një numër arbitrar çiftesh $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Gjeni secilën nga këto nënvargje dhe për secilën nënvarg të gjetur vendosni në kaptësin e parë atë që qëndron përpara ndarësit, kurse në kaptësin e dytë - atë që qëndron pas ndarësit.