preg_replace_callback în PHP

Expresii regulate PHP 4.0.5+

Înlocuiește potrivirile unei expresii regulate cu rezultatul unei funcții scrise de tine.

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

Ce face preg_replace_callback

Când textul de înlocuire trebuie calculat (un preț convertit, o valoare luată dintr-un tablou, un cuvânt transformat), preg_replace nu este suficientă. preg_replace_callback apelează funcția ta pentru fiecare potrivire și pune în text ce returnează aceasta.

Funcția primește tabloul potrivirii: $m[0] întreaga potrivire, $m[1], $m[2]… grupurile. Trebuie să returneze un text.

Parametri

Parametru Descriere
$pattern Expresia regulată (sau un tablou de expresii).
$callback Funcția apelată pentru fiecare potrivire. Primește tabloul potrivirii și returnează textul nou.
$subject Textul în care se face înlocuirea.
$limit Opțional. Numărul maxim de înlocuiri.
$count Opțional. Variabilă în care se salvează numărul de înlocuiri.
$flags Opțional. De exemplu PREG_OFFSET_CAPTURE.

Ce returnează

Textul nou sau null la eroare.

Exemple

Exemplul 1: Șablon cu variabile

Variabilele care lipsesc din tablou rămân neschimbate.

<?php
$date = ["nume" => "Ana", "oras" => "Iași"];
$sablon = "Salut {nume}! Livrăm în {oras} în {zile} zile.";

echo preg_replace_callback('/\{(\w+)\}/', fn($m) => $date[$m[1]] ?? $m[0], $sablon);

Rezultat

Salut Ana! Livrăm în Iași în {zile} zile.

Exemplul 2: Prețuri convertite din euro în lei

<?php
$text = "Abonament: 10 EUR pe lună, 100 EUR pe an.";
$curs = 4.97;

echo preg_replace_callback(
    '/(\d+(?:\.\d+)?) EUR/',
    fn($m) => number_format($m[1] * $curs, 2, ",", ".") . " lei",
    $text
);

Rezultat

Abonament: 49,70 lei pe lună, 497,00 lei pe an.

Greșeli frecvente

  • Funcția ta nu returnează nimic (uiți return) și potrivirile dispar din text, pentru că sunt înlocuite cu un text gol.

Comenzi înrudite

  • preg_replace: Înlocuiește toate potrivirile unei expresii regulate cu alt text.
  • preg_match_all: Găsește toate potrivirile unei expresii regulate într-un text și le pune într-un tablou.
  • array_map: Aplică o funcție pe fiecare element al unui tablou și returnează tabloul cu rezultatele.