Nem rögzítő zárójelek a PHP reguláris kifejezéseiben
A () zárójelek két funkciót töltenek be -
a karakterek csoportosítását és a zseb funkciót.
De mit tegyünk, ha csoportosítanunk kell,
de nem akarunk a zsebbe helyezni?
Ennek a problémának a megoldására találták ki a speciális
nem rögzítő zárójeleket (?: )
- ezek csoportosítanak, de nem helyeznek a zsebbe.
Példa
A következő példában az első zárójelek a csoportosításhoz szükségesek, a másodikak pedig a zsebhez. Azonban mindkét zárójel típus elhelyezi az adatokat a zsebben:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Ennek eredményeként a zsebeinkben a következő lesz:
<?php
var_dump($res[0]); // kiírja 'abab123'
var_dump($res[1]); // kiírja 'ab'
var_dump($res[2]); // kiírja '123'
?>
Példa
Tegyük úgy, hogy az első zárójelpár csak csoportosítson, de ne helyezzen a zsebbe:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Ennek eredményeként az első zsebben a számunk lesz:
<?php
var_dump($res[1]); // kiírja '123'
?>
Gyakorlati feladatok
Adottak részsztringek, kettéosztva
tetszőleges számú $@ párral:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Keresse meg mindegyik ilyen részsztringet és mindegyik megtalált részsztring esetén helyezze az első zsebbe az elválasztó előtti részt, a második zsebbe pedig az elválasztó utáni részt.