Php: Como Soluciónar el Error «The E Modifier Is No Longer Supported»

by Luigi Nori Date: 14-01-2020 php preg replace php7


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:

  1. Busca el patrón definido en la expresión regular (primer parámetro) en la variable $title
  2. 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).
  3. 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.

 
by Luigi Nori Date: 14-01-2020 php preg replace php7 visitas : 775  
 
Luigi Nori

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

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…

Renderización lado servidor de Vue.js on Php

¿Intentas que el renderizado del lado del servidor funcione con PHP para renderizar tu aplicación Vue.js pero se atasca? Hay un montón de grandes recursos por ahí, pero hasta ahra no…

Cómo instalar Caddy Web Server con PHP-FPM en Ubuntu 16.04

El Caddy o Caddy web server es un servidor web de código abierto habilitado para HTTP/2 escrito en Go. Caddy puede funcionar en varios sistemas, incluyendo los que funcionan con…

Cómo obtener el token de acceso a Instagram usando PHP

Cómo obtener el token de acceso a Instagram usando PHP? Para obtener el token de acceso Instagram, primero debes autenticar tu aplicación y luego obtener el token de acceso. Sigue los siguientes…

Optimizar las consultas SQL en PHP: Select y Join

La mayoría de nosotros tiene que relacionarse con bases de datos en nuestros proyectos, y SQL es uno de los languajes más utlizados. SQL (Structured Query Language) es un lenguaje…

Cómo convertirte en un desarrollador web actual

Hay un montón de tutoriales en línea completamente gratis. Si eres lo suficientemente autodirigido e interesado, no tienes ninguna dificultad para entrenarte a ti mismo. El punto para aprender a…

24 recursos gratuitos para programadores novatos

Cuando estamos descubriendo nuevas áreas, una pequeña ayuda es siempre bien venida. En la programación, los recursos existen en grandes cantidades para ayudar a todos los tipos de desarrolladores. Para…

Solucionar Problemas html acentos y eñes: charset UTF-8 / ISO-8859-1 en PHP

La codificación de las páginas web (charset) es un problema recurrente para los webmasters, porque: Depende del editor en que se haya hecho la web, si en el trabajamos por defecto…

Cuixot

Proyecto: Cuixot de Porc Negre Mallorquí gráfica desarrollo web SEO PHP/MYSQL, HTML, AJAX, Javascript, CSS  frontend/backoffice Pcore CMS Link a la web: Cuixot - Productos de la raza de cerdos negros de Mallorca

PHP 7: Las novedades y como afecta a Wordpress

PHP 7, la actualización mas importante y mas deseada para el languaje de desarrollo web lado servidor PHP, está a la vuelta de la esquina. De acuerdo con el calendario…