Nicht-erfassende Klammern in PHP Regex
Klammern () erfüllen zwei Funktionen -
das Gruppieren von Zeichen und die Erfassungsgruppen-Funktion. Aber
was tun, wenn wir gruppieren möchten,
aber nicht in der Erfassungsgruppe speichern wollen?
Für die Lösung dieses Problems wurden spezielle
nicht-erfassende Klammern (?: )
erfunden - sie gruppieren, speichern aber nicht in der Erfassungsgruppe.
Beispiel
Im folgenden Beispiel benötigen wir die ersten Klammern für die Gruppierung und die zweiten - für die Erfassungsgruppe. Allerdings speichern beide Klammern Daten in der Erfassungsgruppe:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Als Ergebnis werden wir folgendes in unseren Erfassungsgruppen haben:
<?php
var_dump($res[0]); // gibt 'abab123' aus
var_dump($res[1]); // gibt 'ab' aus
var_dump($res[2]); // gibt '123' aus
?>
Beispiel
Lassen Sie uns die ersten Klammern so ändern, dass sie nur gruppieren, aber nicht in der Erfassungsgruppe speichern:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Als Ergebnis wird unsere Zahl in der ersten Erfassungsgruppe sein:
<?php
var_dump($res[1]); // gibt '123' aus
?>
Praktische Aufgaben
Es gibt Teilzeichenketten, die in zwei Teile geteilt sind
durch eine beliebige Anzahl von $@ Paaren:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Finden Sie jede dieser Teilzeichenketten und speichern Sie für jede gefundene Teilzeichenkette in der ersten Erfassungsgruppe den Teil vor dem Trennzeichen und in der zweiten Erfassungsgruppe - den Teil nach dem Trennzeichen.