preg_replace($pattern, $replacement, $subject) findet jeden Treffer eines regulären Ausdrucks in einem String und ersetzt ihn. preg_replace('/\s+/', ' ', $text) macht aus jeder Folge von Leerzeichen, Tabs und Zeilenumbrüchen ein einziges Leerzeichen.
Der ursprüngliche String wird nicht verändert; preg_replace() liefert einen neuen. \b markiert eine Wortgrenze, deshalb bleibt cats unberührt.
Rückverweise: {1} und \1
Im Ersatz steht $1 für das, was die erste Capture Group getroffen hat, $2 für die zweite und $0 für den ganzen Treffer. Damit ordnest du den getroffenen Text um.
Schreib den Ersatz in einfache Anführungszeichen. In doppelten wird "\1" zu einem Oktal-Escape (das Byte 0x01), und "${1}" wird als Variable mit dem Namen 1 gelesen, die undefiniert ist und eine String-Syntax verwendet, die seit PHP 8.2 als veraltet gilt. '\1' in einfachen Anführungszeichen funktioniert wie '$1', aber $1 ist die übliche Schreibweise.
Nicht alphanumerische Zeichen entfernen
Eine negierte Zeichenklasse, [^...], trifft alles, was nicht aufgeführt ist. Ersetzt du sie durch '', wird es entfernt. Für Text in anderen Sprachen verwendest du die Unicode-Klassen \p{L} (jeder Buchstabe) und \p{N} (jede Ziffer) mit dem Modifikator u, sonst entfernst du é, ü und jedes japanische Zeichen.
Einen URL-Slug bauen
Mehrere Muster hintereinander machen aus einem Titel einen URL-Slug. Zuerst in Kleinbuchstaben umwandeln, dann jede Folge nicht alphanumerischer Zeichen durch einen Bindestrich ersetzen und schließlich Bindestriche an den Enden entfernen:
Mehrere Muster, ein Limit und eine Zählung
$pattern und $replacement können Arrays sein: Jedes Muster wird der Reihe nach durch den Ersatz mit demselben Index ersetzt. Das vierte Argument begrenzt die Ersetzungen pro Muster (-1 bedeutet kein Limit), und das fünfte bekommt, wie viele Ersetzungen vorgenommen wurden.
Den Ersatz mit preg_replace_callback berechnen
Wenn der Ersatz vom Treffer abhängt, verwendest du preg_replace_callback(). Es ruft deine Funktion einmal pro Treffer mit dem Array $matches auf und fügt ein, was die Funktion zurückgibt. Eine Arrow Function hält kurze Callbacks in einer Zeile.
preg_replace_callback_array() nimmt ein Array von Paaren pattern => callback, wenn mehrere Muster jeweils ihre eigene Funktion brauchen.
Ersatztext aus einer Variable
Ein $ oder ein Backslash im Ersatz hat eine Bedeutung, also kann ein Ersatz, der von einem Nutzer oder aus einer Datenbank kommt, verunstaltet werden. Ein Preis von $10 wird als Verweis auf Gruppe 10 gelesen, die nicht existiert, und kommt leer heraus:
Wenn weder der Suchtext noch der Ersatz ein Muster ist, ist str_replace() die einfachere und schnellere Wahl. Um ein Muster zu testen, bevor du etwas ersetzt, siehe preg_match().
Häufig gestellte Fragen
Wie verwende ich Rückverweise in preg_replace?
Verweise im Ersatz mit $1, $2 (oder \1) auf Capture Groups: preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', '2026-03-14') liefert "14/03/2026". Schreib den Ersatz in einfache Anführungszeichen und verwende ${1}, wenn auf den Verweis eine Ziffer folgt.
Wie entferne ich in PHP alle nicht alphanumerischen Zeichen?
preg_replace('/[^a-zA-Z0-9]/', '', $s) behält nur ASCII-Buchstaben und Ziffern. Um Buchstaben aus jeder Sprache zu behalten (é, ü, 日本語), verwendest du Unicode-Klassen mit dem Modifikator u: preg_replace('/[^\p{L}\p{N}]/u', '', $s).
Was ist der Unterschied zwischen preg_replace und preg_replace_callback?
preg_replace() nimmt einen festen Ersatz-String mit Platzhaltern wie $1. preg_replace_callback() ruft für jeden Treffer eine Funktion auf und verwendet ihren Rückgabewert, sodass du den Ersatz berechnen kannst: in Großbuchstaben umwandeln, damit rechnen oder in einem Array nachschlagen.
Sollte ich str_replace oder preg_replace verwenden?
Verwende str_replace(), wenn du festen Text ersetzt: Es ist schneller und braucht kein Escaping. Verwende preg_replace(), wenn der zu ersetzende Text einem Muster folgt, etwa beliebig viele Leerzeichen, eine beliebige Ziffer oder eine Wortgrenze.
Wie ersetze ich mit preg_replace nur den ersten Treffer?
Übergib ein Limit als viertes Argument: preg_replace('/\d+/', '#', 'a1 b2 c3', 1) liefert "a# b2 c3". Das fünfte Argument, per Referenz übergeben, bekommt die Anzahl der vorgenommenen Ersetzungen.