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.
