Alle Übereinstimmungen finden - preg_match_all()

Diese Funktion macht praktisch dasselbe wie preg_match(), mit dem Unterschied, dass hier alle Vorkommen des Suchausdrucks gefunden werden.

Die Syntax lautet deshalb auch ähnlich: int preg_match_all (string Suchmuster, string Zeichenkette, array &Treffer [, int Flags [, int Versatz]]) Die Funktion erwartet mindestens drei Parameter und zwei optionale.

Suchmuster
Der Reguläre Ausdruck samt Delimiter und Modifier
Zeichenkette
Der Text, der durchsucht werden soll
Treffer
Liefert die gefundenen Treffer und Unterausdrücke
Flags
Optional, erlaubt die Übergabe bestimmter Parameter
Versatz
Optional, die Stelle, ab der gesucht werden soll

Als eigentlichen Rückgabewert erhält man die Anzahl der durch diesen Regulären Ausdruck gefundenen Treffer oder 0, wenn nichts gefunden wurde. Sollte bei der Auswertung ein Fehler aufgetreten sein, wird FALSE zurückgegeben.

Die Rückgabe von preg_match_all()

Bei preg_match_all() ist die Angabe eines dritten Parameters erforderlich. In ihm sind nach erfolgreicher Abarbeitung die gefundenen Treffer enthalten. Index 0 des Treffer-Arrays beinhaltet ein weiteres Array, welches alle Zeichenketten enthält, die auf den gesamten Ausdruck zutreffen. Index 1 dieses Arrays enthält alle Treffer des ersten Unterausdrucks, Index 2 alle Treffer des zweiten Unterausdrucks u.s.w..

In folgenden Beispiel wird auf den Text Der Hund schläft in der Maschine - immernoch ... Der Hund schläft in der Maschine - immernoch ... Der Hund schläft in der Maschine - immernoch ... Der Hund schläft in der Maschine - immernoch ... folgender Regulärer Ausdruck angewendet: ~hund(.*)maschine~isU Zusammen mit preg_match_all() liefert das folgendes Ergebnis: Array ( [0] => Array ( [0] => Hund schläft in der Maschine [1] => Hund schläft in der Maschine [2] => Hund schläft in der Maschine [3] => Hund schläft in der Maschine ) [1] => Array ( [0] => schläft in der [1] => schläft in der [2] => schläft in der [3] => schläft in der ) ) preg_match_all() eignet sich also wunderbar, um aus einem Text viele ähnlich strukturierte Texte zu extrahieren.

Optionale Parameter

Neben den drei anzugebenden Parametern können an preg_match_all() noch zwei weitere übergeben werden, die das Verhalten der Funktion zusätzlich beeinflussen.

Die Flags von preg_match_all()

Durch Angabe bestimmter Flags kann das Verhalten von preg_match_all() beeinflusst werden. Die Funktion preg_match_all() besitzt drei Flags, wobei zwei von ihnen gegenteilige tun und sich somit gegenseitig ausschließen.

PREG_PATTERN_ORDER

Es gibt zwei Flags, mit denen sich die Ausgabereihenfolge im Treffer-Array bestimmen lässt. Standardmäßig ist das Flag PREG_PATTERN_ORDER gesetzt, so dass es nicht unbedingt angegeben werden muss. Durch dieses Flag wird angegeben, dass die Ergebnisse im Array nach dem Pattern geordnet sind. Die oben beschriebene Reihenfolge wird also eingehalten. Im ersten Element befindet sich ein Array, das alle Treffer das Pattern 0 (das gesamte Pattern) enthält. Alle weiteren Elemente enthalten alle Treffer, geordnet nach der Reihenfolge der Unterpattern - daher der Name PREG_PATTERN_ORDER.

PREG_SET_ORDER

Die gegenteilige Angabe dazu ist das Flag PREG_SET_ORDER. Durch es werden die Ergebnisse nicht nach Pattern, sondern nach Ergebnisset geordnet. Das heißt, im ersten Element der Rückgabe sind Gesamttreffer und alle Treffer auf Unterausdrücke zu finden, im zweiten die Treffer des zweiten Ergebnisse, u.s.w..

Obiger RegExp würde durch die Angabe von PREG_SET_ORDER zu folgender Ausgabe führen: Array ( [0] => Array ( [0] => Hund schläft in der Maschine [1] => schläft in der ) [1] => Array ( [0] => Hund schläft in der Maschine [1] => schläft in der ) [2] => Array ( [0] => Hund schläft in der Maschine [1] => schläft in der ) [3] => Array ( [0] => Hund schläft in der Maschine [1] => schläft in der ) ) Das Array enthält vier Elemente, weil vier Treffer gefunden wurden. Jeder Element enthält jeweils den Treffer auf den gesamten Ausdruck als auch den Treffer des ersten (und einzigen) Unterausdrucks.

PREG_OFFSET_CAPTURE

Durch Angabe des Flags PREG_OFFSET_CAPTURE werden zusätzlich zu den gefundenen Treffern noch die jeweiligen Positionen im Suchtext, an denen die Treffer auftreten, zurückgegeben. Man erhält als Array-Elemente der Rückgabe nun wiederum Arrays mit den jeweiligen Treffer, nur ist jedes Element dieser enthaltenen Arrays wiederum ein Array, welches den jeweiligen Treffer und die Position seines Auftretens enthält.

Es wird wiederum das Beispiel von oben verwendet, diesmal gesetztem Flag PREG_OFFSET_CAPTURE. Array ( [0] => Array ( [0] => Array ( [0] => Hund schläft in der Maschine [1] => 4 ) [1] => Array ( [0] => Hund schläft in der Maschine [1] => 55 ) [2] => Array ( [0] => Hund schläft in der Maschine [1] => 106 ) [3] => Array ( [0] => Hund schläft in der Maschine [1] => 157 ) ) [1] => Array ( [0] => Array ( [0] => schläft in der [1] => 8 ) [1] => Array ( [0] => schläft in der [1] => 59 ) [2] => Array ( [0] => schläft in der [1] => 110 ) [3] => Array ( [0] => schläft in der [1] => 161 ) ) )

Die Flags lassen sich auch kombinieren. Bei der Angabe von mehreren Flags müssen diese durch | verbunden werden.

So ließen sich durch diese Anweisung <?PHP preg_match_all($pattern$subject$subPREG_SET_ORDER|PREG_OFFSET_CAPTURE); ?> die Flags PREG_SET_ORDER und PREG_OFFSET_CAPTURE kombinieren.

Der Parameter Versatz

Normalerweise beginnt PHP am Anfang der zu durchsuchenden Zeichenkette mit dem Suchen nach Übereinstimmungen. Über den optionalen Parameter Versatz kann aber auch eine andere Stelle definiert werden, ab der gesucht wird. Der Parameter steht seit der PHP-Version 4.3.3 zur Verfügung (und wird deshalb beim RegExp-Evaluator noch nicht eingesetzt).

Will man diesen Parameter angeben, aber keine Flags definieren, muss man an der Stelle des Parameters Flags den Wert -1 notieren, so wie im folgenden Beispiel gezeigt wird. <?PHP preg_match_all($pattern$subject$sub, -1$versatz); ?> Dies gilt übrigens für alle preg-Funktionen, bei denen hinter den Flags noch Parameter angegeben werden sollen.

Verwandte Themen
Kapitelnavigation