Niet-bewarende haakjes in PHP regex
Haakjes () vervullen twee functies -
groepering van karakters en de functie van capture groep (capturing group). E
Wat te doen als we moeten groeperen,
maar niet in een capture groep willen plaatsen?
Om dit probleem op te lossen zijn speciale
niet-bewarende haakjes (?: )
bedacht - ze groeperen, maar plaatsen niet in een capture groep.
Voorbeeld
In het volgende voorbeeld zijn de eerste haakjes nodig voor groepering, en de tweede - voor een capture groep. Echter, beide soorten haakjes slaan gegevens op in een capture groep:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Het resultaat in onze capture groepen zal het volgende zijn:
<?php
var_dump($res[0]); // geeft 'abab123' weer
var_dump($res[1]); // geeft 'ab' weer
var_dump($res[2]); // geeft '123' weer
?>
Voorbeeld
Laten we ervoor zorgen dat het eerste paar haakjes alleen groepeert, maar niet in een capture groep plaatst:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Het resultaat is dat in de eerste capture groep ons getal staat:
<?php
var_dump($res[1]); // geeft '123' weer
?>
Praktische taken
Gegeven substrings, gescheiden in twee delen
door een willekeurig aantal paren $@:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Vind elk van dergelijke substrings en voor elke gevonden substring, plaats in de eerste capture groep wat voor de scheider staat, en in de tweede capture groep - wat na de scheider staat.