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:
- Wenn der zu untersuchende Text als Array übergeben wird, ist die Rückgabe zwangsläufig auch ein Array.
- Wenn das Suchmuster ein Array ist und der Ersatz ein String, so wird für jedes zutreffende Muster in dem Array dieser String als Ersatz genommen.
- Falls das Suchmuster und der Ersatz beide Arrays sind, werden die jeweils zugehörigen Elemente als Suchmuster und Ersatz angewendet. Soll heißen: das erste Element des Suchmuster-Arrays wird mit dem ersten Element des Ersatz-Arrays ersetzt, das zweite Suchmuster mit dem zweiten Ersatz-Element, und so fort, bis alle Elemente verarbeitet wurden. Sind mehr Ersatz-Ausdrücke als Suchmuster vorhanden, so werden die überzähligen Elemente des Ersatz-Arrays ignoriert.
- Sollten Suchmuster und Ersatz Arrays sein und die Anzahl der Elemente im Ersatz-Array kleiner als die Anzahl der Suchmuster, so wird für die Suchmuster, zu denen es keine Entsprechung im Ersatz-Array gibt, ein Leerstring als Ersatz verwendet.
- Der Fall, dass das Suchmuster ein String ist, der Ersatz aber ein Array, ist sinnfrei. Man kann nicht eine gefundene Stelle mit mehreren möglichen Texten ersetzen - wie sollte entschieden werden, welche Möglichkeit jeweils zu verwenden ist? PHP quitiert den Versuch mit der Fehlermeldung Parameter mismatch, pattern is a string while replacement in an array.
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, $subject, 3);
?>
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
- Anwendungsbeispiele
- Backreferences
- Der Backslash
- Fehlermeldungen
- Metazeichen
- Modifier
- PHP-Funktionen
- preg_replace_callback()
- Reference to non-existent subpattern
- Unterausdrücke
Kapitelnavigation
- Letzte Änderung: 19.07.2006, 18:11:30
- © 2003 - 2010 nophia web