Zeichen gruppieren durch Unterausdrücke

Durch Unterausdrücke können bestimmte Teile des Suchmusters in einer Gruppe zusammengefasst werden. Das hat verschiedene Vorteile. Man kann damit z.B. Quantifier auf ganze Gruppen von Zeichen anwenden. Außerdem lassen sich die Gruppen dann durch sogenannte Backreferences ansprechen. Unterausdrücke werden von runden Klammern () umschlossen.

So kann man zum Beispiel wie im folgenden Beispiel /a(bcdef)+/ die Zeichenkette bcdef zu einer Gruppe zusammenfassen, der folgende Quantifer + bezieht sich damit auf die gesamte Gruppe, so dass der Reguläre Ausdruck auf Zeichenketten wie abcdef, abcdefbcdef, abcdefbcdefbcdef u.s.w. zutreffen würde.

Würde man hier auf die Gruppierung verzichten, also /abcdef+/ definieren, träfe der Ausdruck nur auf Zeichenketten wie abcdef, abcdeff, abcdefff u.s.w. zu, da sich das Plus hier nur auf das letzte Zeichen bezieht.

Auf Unterausdrücke zurückgreifen

Die durch ( und ) gebildeten Gruppen werden automatisch, beginnend bei 1 von links nach rechts durchnummeriert, es wird bei der jeweils öffnenden Klammer gezählt. Der gesamte zutreffende Teil wird dabei mit der Nummer 0 bezeichnet.

Die Unterausdrücke in diesem Ausdruck /a(b((cd)(ef)))/ werden also so nummeriert: 0 => 'abcdef' 1 => 'bcdef' 2 => 'cdef' 3 => 'cd' 4 => 'ef' Durch die Nummerierung lassen sich die einzelnen Unterausdrücke ansprechen und (sogar schon im Suchmuster) weiterverwenden. Das geschieht mittels sogenannter Backreferences. Außerdem kann man sich durch einige der PHP-Funktionen die einzelnen Unterausdrücke zurückgeben lassen.

Namentliche Bezeichnung von Unterausdrücken

Manchmal kann es vorkommen, dass man die einzelnen Unterausdrücke in der Rückgabe der PHP-Funktionen nicht nur als nummerierten, sondern auch als assoziativen Index erhalten möchte. Das ist seit der PHP-Version 4.3.3 ebenso möglich.

Durch das Konstrukt (?P<index>unterausdruck) lässt sich für beliebige Unterausdrücke ein assoziativer Index festlegen. Um im obigen Beispiel den dritten Unterausdruck auch namentlich ansprechen zu können, muss man den Ausdruck folgendermaßen verändern /a(b((?P<der_teil_mit_cd>cd)(ef)))/ was zu folgender Nummerierung führt: 0 => 'abcdef' 1 => 'bcdef' 2 => 'cdef' der_teil_mit_cd => 'cd' 3 => 'cd' 4 => 'ef' Im Namen des Index darf dabei kein Leerzeichen auftauchen, da das sonst zu der Fehlermeldung syntax error after (?P führt. Ebenso wenig darf man die spitzen Klammern um den Namen vergessen, ansonsten kommt es wiederum zu einer Fehlermeldung, nämlich unrecognized character after (?P

Unterbinden der Nummerierung von Unterausdrücken

Manchmal ist es unnötig, ja sogar störend oder unerwünscht, dass ein durch ( und ) eingefasster Bereich nummeriert wird, als Backreference verfügbar ist und in der Rückgabe der verwendeten PHP-Funktionen auftaucht. Um das zu verhindern, notiert man direkt hinter der öffnenden Klammer des entsprechenden Unterausdruck die Angabe ?:, um diesen Ausdruck von der Nummerierung auszunehmen.

Um im obigen Beispiel die Nummerierung und Erfassung des zweiten und vierten Unterausdrucks zu unterbinden, müsste man den Ausdruck also folgendermaßen verändern /a(b(?:(cd)(?:ef)))/ was zu folgender Nummerierung führen würde. 0 => 'abcdef' 1 => 'bcdef' 2 => 'cd'

Die per ?: von der Nummerierung ausgenommenen Unterausdrücke lassen sich somit weder per Backreference ansprechen, noch tauchen sie in der Rückgabe einer der PHP-Funktionen auf.

Sollen in den so gekennzeichneten Untergruppen zusätzlich noch Modifier definiert werden, so kann man die dann nötige Formulierung abkürzen, und die Modifier gleich zwischen ? und : definieren. Den Ausdruck /a(?:(?i)bcdef)/ könnte man also verkürzt auch als /a(?i:bcdef)/ schreiben.

Verwandte Themen
Kapitelnavigation