preg_replace

(PHP 3>= 3.0.9, PHP 4 , PHP 5)

preg_replace -- Sucht und ersetzt einen regulären Ausdruck

Beschreibung

mixed preg_replace ( mixed Suchmuster, mixed Ersatz, mixed Zeichenkette [, int Limit])

Durchsucht Zeichenkette nach Übereinstimmungen mit Suchmuster und ersetzt sie mit Ersatz. Falls Limit angegeben wurde, werden nur Limit Übereinstimmungen ersetzt. Wird Limit weggelassen oder ist es -1, dann werden alle Übereinstimmungen ersetzt.

Ersatz darf Referenzen in der Form \\n oder (seit PHP 4.0.4) $n enthalten, wobei Letztere vorzuziehen ist. Jede dieser Referenzen wird mit dem Text ersetzt, der vom n-ten eingeklammerten Suchmuster erfasst wurde. n kann einen Wert von 0 bis 99 haben. \\0 oder $0 beziehen sich auf den Text, der mit dem kompletten Suchmuster übereinstimmt. Um die Nummer des erfassenden Teil-Suchmusters zu erhalten, werden öffnende Klammern mit 1 beginnend von links nach rechts gezählt.

Wenn Sie mit einer Ersetzung arbeiten wollen, in der auf eine Rückreferenzierung direkt eine weitere Zahl folgt (d.h., direkt nach der Übereinstimmmung mit einem Suchmuster soll eine Zahl kommen), können Sie für Ihre Rückreferenzierung nicht die Schreibweise \\1 verwenden. So würde z.B. \\11 die Funktion preg_replace() verwirren, weil sie nicht weiß, ob Sie die Rückreferenzierung \\1 gefolgt von der Zahl 1 wollen oder nur die Rückreferenzierung \\11. In diesem Fall ist die Lösung, \${1}1 zu verwenden. Damit wird eine isolierte Rückreferenzierung $1 erzeugt und die 1 bleibt ein Zahlensymbol.

Beispiel 1. Die Verwendung von Rückreferenzierungen mit darauf folgenden numerischen Literalen

<?php
$zeichenkette
= "15. April 2003";
$suchmuster = "/(\d+)\. (\w+) (\d+)/i";
$ersetzung = "\${2}1,\$3";
echo
preg_replace($suchmuster, $ersetzung, $zeichenkette);
?>

Dieses Beispiel erzeugt folgende Ausgabe:

April1,2003

Falls Übereinstimmungen gefunden werden, wird die neue Zeichenkette zurückgegeben, andernfalls wird Zeichenkette unverändert zurückgegeben.

Außer Limit, kann jeder Parameter, der an preg_replace() übergeben wird, ein eindimensionales Array sein. Bei Verwendung von Arrays für Suchmuster und Ersatz werden die Schlüssel in der Reihenfolge bearbeitet, in der sie im Array vorliegen. Das ist nicht notwendigerweise dieselbe, wie die numerische Reihenfolge der Indizes. Wenn Sie Indizes verwenden, um festzulegen welches Suchmuster durch welchen Ersatz ersetzt werden soll, sollten Sie vor dem Aufruf von preg_replace() ksort() auf jedes Array anwenden.

Beispiel 2. Die Verwendung von preg_replace() mit indizierten Arrays

<?php
$zeichenkette
= "Der schnelle braune Fuchs sprang über den faulen Hund.";

$suchmuster[0] = "/schnelle/";
$suchmuster[1] = "/braune/";
$suchmuster[2] = "/Fuchs/";

$ersetzungen[2] = "Bär";
$ersetzungen[1] = "schwarze";
$ersetzungen[0] = "langsame";

echo
preg_replace($suchmuster, $ersetzungen, $zeichenkette);
?>

Ausgabe:

Der Bär schwarze langsame sprang über den faulen Hund.

Wenn wir Suchmuster und Ersetzungen mit ksort() sortieren, sollten wir bekommen was wir wollten.

<?php

ksort
($suchmuster);
ksort($ersetzungen);

echo
preg_replace($suchmuster, $ersetzungen, $zeichenkette);

?>

Ausgabe:

Der langsame schwarze Bär sprang über den faulen Hund.

Falls Zeichenkette ein Array ist, wird das Suchen und Ersetzen auf jedes Element von Zeichenkette angewandt und der Rückgabewert ist ebenfalls ein Array.

Falls Suchmuster und Ersatz Arrays sind, nimmt preg_replace() jeweils einen Wert von jedem Array und verwendet sie für das Suchen und Ersetzen in Zeichenkette. Wenn Ersatz weniger Elemente hat als Suchmuster, wird für die restlichen Ersetzungen die leere Zeichenkette verwendet. Ist Suchmuster ein Array und Ersatz eine Zeichenkette, dann wird diese Zeichenkette für jeden Wert von Suchmuster verwendet. Der umgekehrte Fall hätte wohl keinen Sinn.

Mit dem Modifikator /e wird der Parameter Ersatz nach den entsprechenden Ersetzungen der Referenzen von preg_replace() wie PHP-Code behandelt. Tipp: Stellen Sie sicher, dass Ersatz gültigen PHP-Code erzeugt, weil sich PHP sonst über einen Syntaxfehler (parse error) in der Zeile beschwert, die den Aufruf von preg_replace() enthält.

Beispiel 3. Ersetzen mehrerer Werte

<?php
$suchmuster
= array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/",
                   
"/^\s*{(\w+)}\s*=/");
$ersetzen = array ("\\4.\\3.\\1\\2", "$\\1 =");
echo
preg_replace($suchmuster, $ersetzen, "{startDatum} = 1999-5-27");
?>

Dieses Beispiel erzeugt:

$startDatum = 27.5.1999

Beispiel 4. Die Verwendung des Modifikators /e

<?php
preg_replace
("/(<\/?)(\w+)([^>]*>)/e",
              
"'\\1'.strtoupper('\\2').'\\3'",
              
$html_body);
?>

Das wandelt alle HTML-Tags des durchsuchten Textes in Großbuchstaben um.

Beispiel 5. HTML in Text umwandeln

<?php
// $dokument sollte ein HTML-Dokument enthalten.
// Folgendes entfernt HTML-Tags, JavaScript-Abschnitte
// und Leerräume. Außerdem wandelt es ein paar gängige
// HTML-Entitäten in ihr Text-Äquivalent um.

$suche = array ("'<script[^>]*?>.*?</script>'si",  // JavaScript entfernen
                
"'<[\/\!]*?[^<>]*?>'si",           // HTML-Tags entfernen
                
"'([\r\n])[\s]+'",                 // Leerräume entfernen
                
"'&(quot|#34);'i",                 // HTML-Entitäten ersetzen
                
"'&(amp|#38);'i",
                
"'&(lt|#60);'i",
                
"'&(gt|#62);'i",
                
"'&(nbsp|#160);'i",
                
"'&(iexcl|#161);'i",
                
"'&(cent|#162);'i",
                
"'&(pound|#163);'i",
                
"'&(copy|#169);'i",
                
"'&#(\d+);'e");                    // als PHP auswerten

$ersetze = array ("",
                  
"",
                  
"\\1",
                  
"\"",
                  
"&",
                  
"<",
                  
">",
                  
" ",
                  
chr(161),
                  
chr(162),
                  
chr(163),
                  
chr(169),
                  
"chr(\\1)");

$text = preg_replace($suche, $ersetze, $dokument);
?>

Anmerkung: Der Parameter Limit wurde nach PHP 4.0.1pl2 hinzugefügt.

Siehe auch preg_match(), preg_match_all() und preg_split().