Nesaglabājošās iekavas PHP regulārajās izteiksmēs
Iekavas () veic divas funkcijas -
simbolu grupēšanu un capture funkciju. Bet
ko darīt, ja mums ir nepieciešams grupēt,
bet neielikt capture?
Šādas problēmas risināšanai tika izgudrotas speciālas
nesaglabājošās iekavas (?: )
- tās grupē, bet neieliek capture.
Piemērs
Nākamajā piemērā pirmās iekavas mums vajadzīgas grupēšanai, bet otrajās - capture. Tomēr gan vienas, gan otras iekavas saglabā datus capture:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Rezultātā mūsu capture būs sekojošais:
<?php
var_dump($res[0]); // izvadīs 'abab123'
var_dump($res[1]); // izvadīs 'ab'
var_dump($res[2]); // izvadīs '123'
?>
Piemērs
Padarīsim tā, lai pirmā iekavu pāris tikai grupētu, bet neieliktu capture:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Rezultātā pirmajā capture būs mūsu skaitlis:
<?php
var_dump($res[1]); // izvadīs '123'
?>
Praktiskie uzdevumi
Dotas apakšvirknes, sadalītas divās daļās
ar patvaļīgu $@ pāru daudzumu:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Atrodiet katru no šādām apakšvirknēm un katrai atrastajai apakšvirknei ievietojiet pirmajā capture to, kas atrodas pirms atdalītāja, bet otrajā capture - to, kas atrodas aiz atdalītāja.