
Desde la versión 7 ya tenemos error al usar el modificador e
con el preg_replace()
. de hecho el modificador e
, correspondiente a la constante PCRE PREG_REPLACE_EVAL
, era antes utilizado en expresiones regulares junto a la función preg_replace()
cuando era necesario ejecutar PHP para generar el string de salida.
Para hacer su trabajo, el modificador e
echaba mano de la función eval()
, una función muy delicada en lo que a seguridad se refiere, y por ello el modificador e
fue deprecidado en PHP 7. En su lugar se recomienda utilizar preg_replace_callback()
, ya que nos permite definir un callback propio donde podemos ejecutar PHP si es necesario, pero sin necesidad de recurrir a eval()
.
¿Por qué ha sido deprecado?
Vamos a ver un sencillo ejemplo para explicarlo; imaginemos esta expresión donde pasamos un título a letras mayúsculas aplicando la función strtoupper()
al string de salida de preg_replace()
:
$title = "<h1>The /e modifier</h1>"; $title = preg_replace( '#<h([1-6])>(.*?)</h1>#e', '"<h$1>" . strtoupper("$2") . "</h$1>"', $title );
Lo que hace preg_replace()
es:
- Busca el patrón definido en la expresión regular (primer parámetro) en la variable
$title
- Captura los fragmentos que coincidan con los conjuntos entre paréntesis:
([1-6])
y(.*?)
, y los numera por orden de aparición: 1, 2, etc (0 sería la coincidencia completa). - Duelve el string del segundo parámetro sustituyendo las referencias
$1
,$2
, etc, por los correspondientes valores capturados en el paso anterior.
Si observamos el string de salida, podemos ver que se ejecuta una función, strtoupper()
, pero la función está contenida en un string. Para que funciones PHP contenidas en un string sean ejecutadas, hay que pasar ese string a la funcnón eval()
, y eso es lo que hace el modificador e
.
Imaginemos ahora el mismo código pero tomando el valor de $title
desde un input:
$title = $__GET['title']; $title = preg_replace( '#<h([1-6])>(.*?)</h1>#e', '"<h$1>" . strtoupper("$2") . "</h$1>"', $title );
Si el usuario introduce código PHP en el string de entrada, ese código sería ejecutado debido al uso que comentábamos de la función eval()
. Es un punto débil de seguridad, ese es el motivo por el que el modificador e
fue depreciado en PHP 7, y motivo por el que la propia función eval()
se debe utilizar con muchísima precaución.
Alternativa: preg_replace_callback()
Para conseguir el mismo resultado que con preg_replace()
y el modificador e
, pero sin el riesgo de utilizar eval()
, se puede utilizar preg_replace_callback()
, función que nos permite definir un callback propio dónde podemos manejar los valores capturados y generar el string de salida como deseemos, incluyendo la ejecución de código.
El ejemplo anterior quedaría:
$title = $__GET['title']; $title = preg_replace_callback( '#<h([1-6])>(.*?)</h1>#', function ( $matches ) { $output = '<h' . $matches[1] . '>' . strtoupper( $matches[2] ) .'</h' . $matches[1] . '>'; return $output; }, $title );
O un poco mejor:
$title = $__GET['title']; $title = preg_replace_callback( '#<h([1-6])>(.*?)</h1>#', function ( $matches ) { $output = '<h%1$d>%2$s</h%1$d>'; return sprintf( $output, $matches[1], strtoupper( $matches[2] ) ); }, $title );
En pocas palabras, si se necesita ejecutar PHP en el string de salida de preg_replace()
, hay que utilizar preg_replace_callback()
.
En versiones inferiores a PHP 7 se puede utilziar preg_replace()
y el modificador e
, funcionará, pero por ser un potencial agujero de seguridad, mejor utilizar preg_replace_callback()
incluso en versiones inferiores a PHP 7.

Luigi Nori
He has been working on the Internet since 1994 (practically a mummy), specializing in Web technologies makes his customers happy by juggling large scale and high availability applications, php and js frameworks, web design, data exchange, security, e-commerce, database and server administration, ethical hacking. He happily lives with @salvietta150x40, in his (little) free time he tries to tame a little wild dwarf with a passion for stars.
Artículos relacionados
Guía para enviar Facturas Electrónicas a Agencia Tributaria Española con PHP
En este artículo, te explicaremos paso a paso cómo comunicarte con el servicio XML de Hacienda Española para enviar facturas electrónicas utilizando PHP. Este enfoque es ideal para empresas o…
Novedades de PHP 8.4: Un Salto Evolutivo para el Desarrollo Web
PHP sigue siendo uno de los lenguajes de programación más utilizados para el desarrollo web, y con cada versión nueva, el lenguaje se adapta a las necesidades modernas de los…
Cómo configurar PHP en Caddy Server
Caddy Server es una plataforma de servidor web modular y moderna que soporta certificados HTTPS automáticos, QUIC y HTTP/2, compresión Zstd y Brotli, y varias características modernas, así como características…
Guía Básica: Cómo Integrar una Base de Datos ArangoDB con PHP
ArangoDB es una base de datos multi-modelo que ofrece una combinación poderosa de características de base de datos documental, de grafos y de clave-valor. Su flexibilidad y rendimiento la convierten…
Seguimiento en tiempo real de los vuelos: la API de Flight Tracker
La API de Flight Tracker brinda a los desarrolladores la capacidad de acceder al estado de los vuelos en tiempo real, lo cual resulta extremadamente útil para integrar un seguimiento…
Ejecución de funciones PHP en AWS Lambda y API Gateway
¿Qué es AWS Lambda? AWS Lambda es un servicio de procesamiento sin servidor que puede ejecutar código en respuesta a eventos o condiciones predeterminados y administrar automáticamente todos los recursos de…
Cómo enviar un correo electrónico desde un formulario de contacto HTML
En el artículo de hoy vamos a escribir sobre cómo hacer un formulario que funcione y que al pulsar ese botón de envío sea funcional y envíe el correo electrónico…
6 Formas de leer archivos en PHP, con strings, array y más
Bienvenido a un tutorial sobre cómo leer archivos en PHP. Sí, así es, ¿qué tan difícil puede ser leer archivos en PHP? Se sorprenderá... No es tan sencillo como algunos…
Instalar Laravel Homestead en Windows 10
Instalar Homestead Mediante Vagrant Laravel Homestead es una máquina virtual que viene ya preparada para el desarrollo de proyectos con Laravel y otras tecnologías de PHP . Al ser una máquina…
Cookies HTTP: cómo funcionan y cómo usarlas
Hoy vamos a escribir sobre la forma de almacenar datos en un navegador, por qué los sitios web utilizan cookies y cómo funcionan en detalle. Continúa leyendo para averiguar cómo implementarlas…
PHP 8.0: mas rápido que nunca con el compilador JIT
Probablemente ya habéis oido la noticia hace unos meses de que el compilador JIT será agregado a PHP 8. Ya desde PHP 7.0, se han hecho cambios para mejorar el…
Guía sencilla para convertir imágenes a WebP en PHP
El 30 de septiembre de 2010, Google anunció la publicación de un nuevo estándar abierto para la compresión con pérdida de gráficos de 24 bits en la web. La base…