Signatur
Beschreibung
preg_replace_callback_array() ermöglicht es, mehrere reguläre Ausdrücke gleichzeitig auf einen Eingabe-String anzuwenden, wobei jedem Muster ein eigener Callback zugeordnet wird. Der erste Parameter ist ein assoziatives Array, dessen Schlüssel die regulären Ausdrücke und dessen Werte die entsprechenden Callbacks sind. Die Callbacks werden in der Reihenfolge ihrer Definition aufgerufen.
Im Gegensatz zu preg_replace_callback(), bei dem nur ein Muster (oder ein Muster-Array mit identischem Callback) verwendet werden kann, erlaubt diese Funktion eine saubere und übersichtliche Definition von muster-spezifischen Ersetzungslogiken ohne verschachteltes if/switch innerhalb eines einzigen Callbacks.
Die Funktion arbeitet sequenziell: Das Ergebnis des ersten Musters wird als Eingabe für das nächste Muster verwendet. Das sollte bei der Gestaltung der Muster berücksichtigt werden, um unerwünschte Wechselwirkungen zu vermeiden. Wenn $subject ein Array ist, wird die Funktion auf jedes Element angewendet und gibt ein Array zurück.
Ab PHP 7.4 steht der Parameter $flags zur Verfügung, der PREG_OFFSET_CAPTURE und PREG_UNMATCHED_AS_NULL akzeptiert und das Verhalten der an die Callbacks übergebenen Match-Arrays beeinflusst.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $pattern Pflicht | array | Assoziatives Array, bei dem die Schlüssel reguläre Ausdrücke (inkl. Delimiter und Modifier, z. B. '/\d+/i') und die Werte aufrufbare Callbacks (callable) sind. |
|
| $subject Pflicht | string|array | Der Eingabe-String oder ein Array von Strings, auf den die Muster angewendet werden. Bei einem Array wird jedes Element separat verarbeitet. | |
| $limit | int | -1 | Maximale Anzahl von Ersetzungen pro Muster und Subject. -1 bedeutet unbegrenzt. |
| $count | int | Wird nach dem Aufruf mit der Gesamtanzahl aller durchgeführten Ersetzungen befüllt (Referenz-Parameter). | |
| $flags | int | 0 | Kann PREG_OFFSET_CAPTURE und/oder PREG_UNMATCHED_AS_NULL sein. Beeinflusst die Struktur der Match-Arrays, die an die Callbacks übergeben werden. Verfügbar ab PHP 7.4. |
Rückgabewert
$subject ein Array war). Im Fehlerfall wird null zurückgegeben.Beispiele
Verschiedene Muster mit eigenen Callbacks ersetzen
<?php
$subject = 'Es sind 3 Katzen und 7 Hunde sowie FEHLER und WARNUNG aufgetreten.';
$result = preg_replace_callback_array(
[
'/\d+/' => function (array $matches): string {
// Zahlen verdoppeln
return (string)($matches[0] * 2);
},
'/FEHLER/' => function (array $matches): string {
return '[!!! FEHLER !!!]';
},
'/WARNUNG/' => function (array $matches): string {
return '[Warnung]';
},
],
$subject
);
echo $result;
HTML-Tags und Entities mit je eigenem Callback konvertieren
<?php
$text = 'Preis: 19,99 EUR & Rabatt: 5 EUR -- Details: <b>wichtig</b>';
$count = 0;
$result = preg_replace_callback_array(
[
// Zahlen mit Komma als Dezimaltrennzeichen ins englische Format umwandeln
'/(\d+),(\d+)/' => fn(array $m): string => $m[1] . '.' . $m[2],
// Ampersand HTML-sicher machen
'/&(?!amp;)/' => fn(array $m): string => '&',
// Einfache HTML-Tags entfernen
'/<[^>]+>/' => fn(array $m): string => '',
],
$text,
limit: -1,
count: $count
);
echo $result . PHP_EOL;
echo "Ersetzungen: $count" . PHP_EOL;
// Wichtig · Fallstricke
Reihenfolge beachten: Die Muster werden sequenziell angewendet. Das bedeutet, das Ergebnis eines Musters kann durch ein nachfolgendes Muster weiter verändert werden. Die Reihenfolge der Schlüssel im Array ist daher entscheidend.
Fehlerbehandlung: Bei einem ungültigen regulären Ausdruck gibt die Funktion null zurück und erzeugt einen E_WARNING-Fehler. Ab PHP 8.0 werden preg_*-Fehler über preg_last_error() bzw. preg_last_error_msg() abgefragt werden, anstatt eine Exception zu werfen — sofern kein eigener Error-Handler gesetzt ist.
Performance: Wenn viele Muster auf große Texte angewendet werden, kann es performanter sein, die Muster zu einem einzigen zu kombinieren und innerhalb eines einzelnen Callbacks zu unterscheiden — abhängig vom konkreten Anwendungsfall.