Heim > Artikel > Backend-Entwicklung > php – Bedingte PCRE-Untergruppe für reguläre Ausdrücke
Sie können den Matcher bedingt mit einer Untergruppe abgleichen lassen oder zwischen zwei optionalen Untergruppen auswählen, basierend auf dem Ergebnis einer Behauptung oder ob eine vorherige erfassende Untergruppe übereinstimmt. Die beiden Syntaxen für bedingte Untergruppen lauten wie folgt:
(?(condition)yes-pattern) (?(condition)yes-pattern|no-pattern)
Wenn die Bedingung erfüllt ist, wird das Ja-Muster verwendet, andernfalls wird das Nein-Muster verwendet (falls angegeben). Wenn mehr als zwei optionale Untergruppen vorhanden sind, wird ein Fehler bei der Kompilierung generiert.
Es gibt zwei Bedingungen. Wenn die Klammern von (Bedingung) Text sind, der aus Zahlen besteht, ist die Bedingung erfüllt, wenn die (vorherige) durch die Zahl dargestellte Untergruppe übereinstimmt (d. h. unter Verwendung des Ja-Musters). Betrachten Sie das folgende Muster, dem zur besseren Lesbarkeit einige Leerzeichen hinzugefügt wurden (siehe Option PCRE_EXTENDED) und das in drei Teile unterteilt ist: ( ( )? [^()] (?(1) ) )
The Der erste Teil des Musters entspricht einer optionalen linken Klammer. Wenn dieses Zeichen vorkommt, wird es auf die erste Untergruppe der erfassten Teilzeichenfolge gesetzt. Der zweite Teil entspricht einem oder mehreren Zeichen, die keine Klammern sind. Der dritte Teil ist eine bedingte Untergruppe, die testet, ob die erste Untergruppe übereinstimmt, das heißt, die Zielzeichenfolge beginnt mit einer linken Klammer und die Bedingung ist TRUE, dann verwenden Sie ein Ja-Muster, was bedeutet, dass a Hier muss eine Übereinstimmung durchgeführt werden. Andernfalls stimmt die Untergruppe mit nichts überein, da kein Muster vorhanden ist. Mit anderen Worten: Dieses Muster entspricht einer Zeichenfolge ohne Klammern oder einer durch schließende Klammern eingeschlossenen Zeichenfolge.
Wenn eine bedingte Zeichenfolge (R) vorliegt, ist sie erfüllt, wenn ein rekursiver Aufruf eines Musters oder Untermusters erfolgt. Auf der „obersten Ebene“ ist die Bedingung immer falsch.
Wenn die Bedingung keine Folge von Zahlen oder (R) ist, muss es eine Behauptung sein. Die Behauptung kann hier beliebig, positiv, negativ, vorwärts oder rückwärts sein. Betrachten Sie dieses Muster, wiederum mit etwas Leerraum zur besseren Lesbarkeit und zwei alternativen Pfaden in der zweiten Zeile.
(?(?=[^a-z]*[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
Bedingt Eine positive Behauptung, die mit einer optionalen Folge nicht-kleingeschriebener alphabetischer Zeichen, gefolgt von einem Kleinbuchstaben, übereinstimmt. Mit anderen Worten: Es wird geprüft, ob im Ziel mindestens ein Kleinbuchstabe vorhanden ist. Wenn ein Kleinbuchstabe gefunden wird, stimmt das Ziel mit dem ersten optionalen Zweig überein, andernfalls mit dem zweiten Zweig. Dieses Muster gleicht Zeichenfolgen in zwei Formaten ab: dd-aaa-dd oder dd-dd-dd. aaa steht für Kleinbuchstaben und dd ist eine Zahl.