preg_replace() y preg_replace_callback() en PHP: reemplazar con patrones

preg_replace() y preg_replace_callback() son las dos funciones PHP para sustituir texto usando expresiones regulares. La primera es directa para reemplazos estáticos con referencias hacia atrás; la segunda es más potente cuando la sustitución depende de lógica arbitraria sobre cada coincidencia.

preg_replace(): sustitución básica

<?php
// Eliminar etiquetas HTML
$html  = '<p>Hola <strong>mundo</strong>, esto es <em>PHP</em>.</p>';
$texto = preg_replace('/<[^>]+>/', '', $html);
echo $texto; // Hola mundo, esto es PHP.

// Normalizar espacios múltiples
$sucio  = 'texto  con    espacios   extra';
$limpio = preg_replace('/s+/', ' ', trim($sucio));
echo $limpio; // texto con espacios extra

// Eliminar comentarios HTML
$src     = '<p>contenido</p>';
$sin     = preg_replace('/<!--.*?-->/s', '', $src);
?>

Backreferences: reutilizar grupos capturados

En el patrón de reemplazo, $1, $2... (o \1, \2...) hacen referencia a los grupos de captura del patrón de búsqueda:

<?php
// Invertir nombre y apellido: "García, Ana" ? "Ana García"
$nombre = 'García, Ana';
echo preg_replace('/^(w+), (w+)$/', '$2 $1', $nombre);
// Ana García

// Convertir fecha de AAAA-MM-DD a DD/MM/AAAA
$fecha = '2026-07-21';
echo preg_replace('/^(d{4})-(d{2})-(d{2})$/', '$3/$2/$1', $fecha);
// 21/07/2026

// Añadir atributo target="_blank" a todos los enlaces externos
$html = '<a href="https://php.net">PHP</a>';
echo preg_replace(
    '/(<as[^>]*href="https?://[^"]*"[^>]*)(/>|>)/',
    '$1 target="_blank" rel="noopener"$2',
    $html
);
?>

Grupos con nombre en el reemplazo

<?php
// Formato ISO ? formato español con grupos nombrados
$fecha = '2026-07-21';
echo preg_replace(
    '/^(?P<anio>d{4})-(?P<mes>d{2})-(?P<dia>d{2})$/',
    '${dia}/${mes}/${anio}',
    $fecha
);
// 21/07/2026
?>

El parámetro $limit

<?php
$texto = 'uno dos uno dos uno';

// Sin límite: reemplaza todas las coincidencias
echo preg_replace('/uno/', 'ONE', $texto);
// ONE dos ONE dos ONE

// Limit 1: solo la primera coincidencia
echo preg_replace('/uno/', 'ONE', $texto, 1);
// ONE dos uno dos uno

// Limit 2: las dos primeras
echo preg_replace('/uno/', 'ONE', $texto, 2);
// ONE dos ONE dos uno
?>

preg_replace_callback(): lógica en el reemplazo

Cuando la sustitución no puede expresarse con una cadena estática (necesitas transformar el texto capturado), usa preg_replace_callback():

<?php
// Convertir números a su representación en palabras (simplificado)
$texto = 'Hay 3 usuarios y 12 pedidos pendientes';
$resultado = preg_replace_callback(
    '/d+/',
    function (array $m): string {
        $map = [1 => 'uno', 2 => 'dos', 3 => 'tres', 4 => 'cuatro',
                5 => 'cinco', 6 => 'seis', 7 => 'siete', 8 => 'ocho',
                9 => 'nueve', 10 => 'diez', 11 => 'once', 12 => 'doce'];
        return $map[(int) $m[0]] ?? $m[0];
    },
    $texto
);
echo $resultado; // Hay tres usuarios y doce pedidos pendientes
?>

Ejemplo real: procesar Markdown ligero

<?php
function markdownLigero(string $texto): string
{
    // **negrita**
    $texto = preg_replace('/**(.+?)**/u', '<strong>$1</strong>', $texto);
    // *cursiva*
    $texto = preg_replace('/*(.+?)*/u', '<em>$1</em>', $texto);
    // `código`
    $texto = preg_replace_callback('/`([^`]+)`/', function ($m) {
        return '<code>' . htmlspecialchars($m[1]) . '</code>';
    }, $texto);

    return $texto;
}

echo markdownLigero('Usa **preg_replace()** o `preg_replace_callback()` en *PHP*.');
// Usa <strong>preg_replace()</strong> o <code>preg_replace_callback()</code> en <em>PHP</em>.
?>

preg_replace_callback_array(): múltiples patrones con lógicas distintas

<?php
$texto = 'Precio: 1234.56 EUR. IVA: 21%. Descuento: 50 EUR.';

$resultado = preg_replace_callback_array([
    '/d+.d+/' => fn($m) => number_format((float) $m[0], 2, ',', '.'),
    '/(d+)%/'   => fn($m) => '<strong>' . $m[1] . ' %</strong>',
    '/(d+) EUR/' => fn($m) => $m[1] . ' €',
], $texto);

echo $resultado;
// Precio: 1.234,56 EUR. IVA: <strong>21 %</strong>. Descuento: 50 €.
?>

La documentación de preg_replace() y la de preg_replace_callback() cubren todos los flags del cuarto parámetro y el comportamiento con arrays de patrones y sujetos.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP