Sucht und ersetzt mit regulären Ausdrücken unter Verwendung eines Callbacks

# preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

preg_replace_callback — Sucht und ersetzt mit regulären Ausdrücken unter Verwendung eines Callbacks

### Beschreibung

function preg_replace_callback(
string|array `$pattern`,
callable `$callback`,
string|array `$subject`,
int `$limit` = -1,
int `&$count` = `null`,
int `$flags` = 0
): string|array|null

Abgesehen von der Tatsache, dass statt des Parameters `replacement` ein `callback` angegeben werden soll, ist das Verhalten dieser Funktion identisch zu preg_replace().

### Parameter-Liste

`pattern`

  Der Ausdruck, nach dem gesucht werden soll. Es kann entweder eine Zeichenkette oder ein Array mit Zeichenketten sein.

`callback`

  Ein Callback, dem ein Array von Übereinstimmungen mit `subject` übergeben wird. Der Callback sollte die Ersetzungs-Zeichenkette liefern. Dies ist die Callback-Signatur:

  function handler(array `$matches`): string

  Häufig werden Sie die `callback`-Funktion für preg_replace_callback() nur an einer Stelle benötigen. In diesem Fall können Sie eine Anonyme Funktion verwenden, um innerhalb des Aufrufs von preg_replace_callback() den Callback zu deklarieren. Auf diese Weise haben Sie alle Informationen für den Aufruf an einer Stelle und füllen den Namensraum für Funktionen nicht mit Namen für Callback-Funktionen, die sonst nirgends verwendet werden.

  Beispiel #1 preg_replace_callback() und Anonyme Funktion

  `<?php
  // ein Kommandozeilen-Filter im Unix-Stil zum Umwandeln von Groß- in
  // Kleinschreibung am Beginn eines Abschnitts
  $fp = fopen("php://stdin", "r") or die("kann stdin nicht lesen");
  while (!feof($fp)) {
  $zeile = fgets($fp);
  $zeile = preg_replace_callback(
  '|<p>\s*\w|',
  function ($treffer) {
  return strtolower($treffer[0]);
  },
  $zeile
  );
  echo $zeile;
  }
  fclose($fp);
  ?>`
`subject`

  Die Zeichenkette oder ein Array mit Zeichenketten zum Suchen und Ersetzen.

`limit`

  Die Höchstzahl der Ersetzungen für jedes Suchmuster in jeder `subject`-Zeichenkette. Standardmäßig `-1` (unbegrenzt).

`count`

  Falls angegeben, wird dieser Variable die Anzahl vorgenommener Ersetzungen zugewiesen.

`flags`

  `flags` ist eine Kombination der Flags `PREG_OFFSET_CAPTURE` und `PREG_UNMATCHED_AS_NULL`, die das Format des matches-Arrays beeinflussen. Details sind der Beschreibung in preg_match() zu entnehmen.

### Rückgabewerte

Falls `subject` ein Array ist, gibt preg_replace_callback() ein Array zurück und andernfalls eine Zeichenkette. Bei einem Fehler ist der Rückgabewert `null`.

Falls Übereinstimmungen gefunden werden, wird die neue Zeichenkette zurückgegeben und andernfalls die unveränderte Zeichenkette `subject`

### Fehler/Exceptions

Wenn das übergebene Regex-Muster nicht zu einem gültigen Regex kompiliert werden kann, wird ein Fehler der Stufe `E_WARNING` ausgegeben.

### Changelog

Version | Beschreibung
--- | ---
7.4.0 | Der Parameter `flags` wurde hinzugefügt.

### Beispiele

Beispiel #2 preg_replace_callback()-Beispiel

`<?php
// dieser Text wurde 2002 verwendet
// wir wollen ihn für 2003 aktualisieren
$text = "Aprilscherze gibts am 01.04.2002\n";
$text.= "Das letzte Weihnachten war am 24.12.2001\n";
// die Callback-Funktion
function naechstes_jahr($treffer)
{
// wie üblich: $treffer[0] ist die Übereinstimmung mit dem
// kompletten Suchmuster, $treffer[1] die Übereinstimmung mit
// dem ersten eingeklammerten Teilsuchmuster und so weiter
return $treffer[1].($treffer[2]+1);
}
echo preg_replace_callback(
"|(\d{2}\.\d{2}\.)(\d{4})|",
"naechstes_jahr",
$text);
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    Aprilscherze gibts am 01.04.2003
    Das letzte Weihnachten war am 24.12.2002

Beispiel #3 preg_replace_callback() unter Verwendung einer rekursiven Struktur um gekapselten BB-Code zu verarbeiten

`<?php
$eingabe = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";
function parseTagsRecursive($eingabe)
{
$regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';
if (is_array($eingabe)) {
$eingabe = '<div style="margin-left: 10px">'.$eingabe[1].'</div>';
}
return preg_replace_callback($regex, 'parseTagsRecursive', $eingabe);
}
$ausgabe = parseTagsRecursive($eingabe);
echo $ausgabe;
?>`

### Siehe auch

- PCRE-Suchmuster
- preg_replace_callback_array() - Perform a regular expression search and replace using callbacks
- preg_quote() - Maskiert Zeichen regulärer Ausdrücke
- preg_replace() - Sucht und ersetzt mit regulären Ausdrücken
- preg_last_error() - Liefert den Fehlercode der letzten PCRE-RegEx-Auswertung
- Anonymous functions

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open