Fundstellen ersetzen - preg_replace()

Die Funktion preg_replace() durchsucht einen Text nach Übereinstimmungen mit dem Suchmuster und ersetzt die gefundenen Stellen durch den angegebenen Ersatzstring. Die Syntax lautet: mixed preg_replace (mixed Suchmuster, mixed Ersatz, mixed Zeichenkette [, int Limit [, int &Anzahl]]) Sie erwartet drei Parameter, optional kann noch ein vierter angegeben werden.

Suchmuster
Das Suchmuster
ersatz
Der Ersatz
Zeichenkette
Der Text, der durchsucht werden soll
Limit
Optional, die maximale Anzahl an Ersetzungen
Anzahl
Optional, enthält nach der Ersetzung die Anzahl an ersetzten Stellen

Als Rückgabe erhält man den ersetzten Text, entweder in Form eines Strings oder als Array, welches Strings als Elemente enthält.

Die Parameter von preg_replace

Sicherlich ist Ihnen schon aufgefallen, dass fast alle der Parameter und sogar die Rückgabe der Funktion preg_replace() vom Typ mixed sind. Mixed ist kein Typ an sich, sondern vielmehr ein Ausdruck dafür, dass an dieser Stelle verschiedene Typen zum Einsatz kommen können. Genauer gesagt kann entweder eine einzelne Zeichenkette (ein String) oder ein Array verwendet werden.

Die Parameter Suchmuster, Ersatz und Zeichenkette

Nachfolgend sind die möglichen Typen-Kombinationen für Suchmuster, Ersatz und Zeichenkette und daraus folgende Konsequenzen aufgeführt:

Der Parameter Limit

Durch die Angabe des Parameters Limit kann die maximale Anzahl an durchzuführenden Ersetzungen angegeben werden.

So würden durch diesen Code <?PHP $neu preg_replace($pattern$replace$subject3); ?> maximal 3 Ersetzungen durchgeführt werden.

Der Parameter Anzahl

Seit der PHP-Version 5.1.0 kann bei der Verwendung von preg_replace() noch ein fünfter Parameter angegeben werden. In ihm steht dann nach der Ersetzung die Anzahl der ersetzten Stellen.

Dabei gibt ein paar Dinge zu beachten. Die Variable, die als Parameter Anzahl angegeben wird, muss vor der Abarbeitung der Funktion definiert werden, da es sonst zu einer Fehlermeldung kommt. Soll für den Parameter Limit kein Wert angegeben werden, so muss an seiner Stelle -1 notiert werden, wie in folgendem Beispiel zu sehen: <?PHP $anzahl 0; $neu preg_replace($pattern$replace$subject, -1$anzahl); ?> Durch obigen Code werden so viele Ersetzungen wie möglich vorgenommen, die Anzahl der erfolgten Ersetzungen steht anschließend in der Variable $anzahl zur Verfügung.

Besonderheiten beim Einsatz von preg_replace()

Beim Einsatz von preg_replace() gibt es ein paar Besonderheiten, die beachtet werden sollten. So kann man z.B. im Parameter Ersatz im Suchmuster definierte Unterausdrücke referenzieren und durch die Angabe des Modifers e PHP veranlassen, den Ersatz als Code auszuführen. Auf beide Aspekte soll im folgenden näher eingegangen werden.

Unterausdrücke im Ersatz referenzieren

Im Suchmuster definierte Unterausdrücke lassen sich im Ersatz referenzieren, um sie dort weiter zu verwenden. Angesprochen werden sie dabei über eine Backreference auf ihre Nummer oder auf ihren eventuell vergebenen assoziativen Index.

Ein Beispiel zum Einsatz von Backreferences

In vielen Foren kann man Verweise in einer Art Kurzschreibweise notieren, was dann ungefähr so aussieht: [url=http://regexp-evaluator.de]RegExp-Evaluator[/url] Um diese Angaben in richtige HTML-Verweise umzuwandeln, wird die PHP-Funktion preg_replace() verwendet. Man definiert als Suchmuster einfach #\[url=(.*)\](.*)\[/url\]#Uis mit den darin enthaltenen Unterausdrücken für URL und Verweistext. Diese kann man im Ersatz dann referenzieren <a href="\1">\2</a> und zusammen mit dem benötigten HTML-Code angeben. Zusammen mit preg_replace() <?PHP $inhalt preg_replace('#\[url=(.*)\](.*)\[/url\]#Uis''<a href="\1">\2</a>'$inhalt); ?> kann man so alle Vorkommen der Tags durch HTML-Code ersetzen.

preg_replace() und Modifier e

PHP bietet mit dem Modifier e ein mächtiges Werkzeug, um auch komplexere Ersetzungen durchzuführen. Wird dieser Modifier angegeben, geschieht folgenden: Die refenrezierten Backreferences werden innerhalb des Ersatzstrings normal ersetzt, anschließend wird der Ersatzstring als PHP-Code ausgewertet und das Ergebnis der Auswertung als eigentlicher Ersatz verwendet.

Diese Vorgehensweise wird zum Beispiel benötigt, wenn man definierte Unterausdrücke als Index eines Arrays und den damit angesprochenen Wert als Ersatz verwenden will (so wie in diesem Beispiel). Auch wenn man auf den Ersatz vor der Ersetzung noch eine PHP-Funktion anwenden will, muss man den Modifier e benutzen.

Beispiel für den Einsatz des Modifers e

Angenommen, man wollte im obigen Beispiel den Verweistext vor der Ersetzung noch in Großbuchstaben wandeln. Normalerweise sollte man erwarten, dass das durch folgenden Code zu erledigen wäre: <?PHP $inhalt preg_replace('#\[url=(.*)\](.*)\[/url\]#Uis''<a href="\1">'.strtoupper('\2').'</a>'$inhalt); ?> Leider funktioniert das so nicht. Vielmehr wird die Funktion strtoupper() hier lediglich auf die Zeichenkette \2 angewendet und nicht auf den dadurch referenzierten Unterausdruck. Hier kommt der Modifier e zum Einsatz.

Das Suchmuster bleibt gleich, es wird lediglich um den Modifier e ergänzt: #\[url=(.*)\](.*)\[/url\]#Uise Der Ersatzstring sieht der fehlerhaften Version auch sehr ähnlich, es müssen nur ein paar Veränderungen vorgenommen werden. Als Ersatz muss ein String angegeben werden, der sich per PHP ausführen ließe. Der Ersatz ist zwar ein (verketteter) String, er lässt sich auch per PHP ausführen - trotzdem erfüllt er nicht die benötigten Kriterien.

Damit der Modifier e zum Einsatz kommen kann, muss der Ersatzcode noch in " eingeschlossen werden - da wir einen per PHP ausführbaren String benötigen. Um fehlerfreien Code und eine funktionierende Ersetzung zu erhalten, müssen die im String enthaltenen " mit einem Backslash maskiert werden. Außerdem müssen die Backreferences jetzt mittels zwei Backslash referenziert werden, was im Endeffekt folgenden Ersatzstring ergibt: "'<a href=\"\\1\">'.strtoupper('\\2').'</a>'" Wenden wir also schlußendlich folgende Funktion <?PHP $inhalt preg_replace('#\[url=(.*)\](.*)\[/url\]#Uise'"'<a href=\"\\1\">'.strtoupper('\\2').'</a>'"$inhalt); ?> auf unseren Text an, erhalten wird das gewünschte Ergebnis.

Wem das zu kompliziert erscheint, der sollte sich die im nächsten Abschnitt behandelte Funktion preg_replace_callback() anschauen. Die führt die Ersetzung mittels einer Callback-Funktion durch, was die Syntax vereinfacht, aber auch mehr Möglichkeiten bietet.

Verwandte Themen
Kapitelnavigation