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, $sub, PREG_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
- Anwendungsbeispiele
- Aufbau von Regulären Ausdrücken
- Backreferences
- Delimiter
- Der Backslash
- Einfache Texte finden
- Fehlermeldungen
- Metazeichen
- Modifier
- PHP-Funktionen
- preg_match
- Quantifier
- Unterausdrücke
- Zeichenklassen
Kapitelnavigation
- Letzte Änderung: 24.07.2010, 03:39:02
- © 2003 - 2010 nophia web