Neohranjevalni oklepaji v regularnih izrazih PHP
Oklepaji () opravljajo dve funkciji -
grupiranje znakov in funkcijo zajema (capturing). Kaj
pa narediti, če želimo grupirati,
a ne zajeti v skupino?
Za rešitev tega problema so bili izumljeni posebni
neohranjevalni oklepaji (?: )
- ti grupirajo, vendar ne zajamejo v skupino.
Primer
V naslednjem primeru prvi oklepaji so potrebni za grupiranje, drugi pa za zajem. Vendar, obe vrsti oklepajev shranijo podatke v zajem:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Kot rezultat bo v naših zajemih naslednje:
<?php
var_dump($res[0]); // izpiše 'abab123'
var_dump($res[1]); // izpiše 'ab'
var_dump($res[2]); // izpiše '123'
?>
Primer
Naredimo tako, da bo prvi par oklepajev le grupiral, ne pa tudi zajel v skupino:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Kot rezultat bo v prvem zajemu naša številka:
<?php
var_dump($res[1]); // izpiše '123'
?>
Praktične naloge
Dane so podnize, razdeljene na dva dela
poljubno količino parov $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Poiščite vsako od takih podnizov in za vsako našto podniz v prvi zajem postavite tisto, kar je pred ločilom, v drugi zajem pa - tisto, kar je za ločilom.