Ei-capture-sulkeet PHP:n säännöllisissä lausekkeissa
Sulkeet () suorittavat kaksi tehtävää -
merkkien ryhmittely ja capturen tehtävä. Mutta
mitä tehdä, jos haluamme ryhmitellä,
mutta emme tallentaa captureen?
Tämän ongelman ratkaisemiseksi on keksitty erityiset
ei-capture-sulkeet (?: )
- ne ryhmittelevät, mutta eivät tallenna captureen.
Esimerkki
Seuraavassa esimerkissä ensimmäiset sulkeet tarvitsemme ryhmittelyyn, ja toiset - captureen. Kuitenkin sekä nämä että nuo sulkeet tallentavat tiedot captureen:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Tuloksena captureissamme on seuraavaa:
<?php
var_dump($res[0]); // tulostaa 'abab123'
var_dump($res[1]); // tulostaa 'ab'
var_dump($res[2]); // tulostaa '123'
?>
Esimerkki
Tehdään niin, että ensimmäinen sulkepari vain ryhmittelee, mutta ei tallenna captureen:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Tuloksena ensimmäisessä capturessa on numeromme:
<?php
var_dump($res[1]); // tulostaa '123'
?>
Käytännön tehtävät
Annettu alimerkkijonoja, jaettu kahteen osaan
mielivaltaisella määrällä $@ -pareja:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Etsi jokainen tällainen alimerkkijono ja jokaiselle löydetylle alimerkkijonolle aseta ensimmäiseen captureen se, mikä on ennen erotinta, ja toiseen captureen - se, mikä on erottimen jälkeen.