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 : 462  
 
Luigi Nori

Luigi Nori

Lavora in Internet dal 1994 (praticamente una mummia), specializzato in tecnologie Web fa felici i suoi clienti smanettando con applicazioni su larga scala e ad alta disponibilità, frameworks php e js, disegno web, intercambio dati, sicurezza, e-commerce, amministrazione database e server, hacking etico. Convive felicemente con @salvietta150x40, nel (poco) tempo libero cerca di addomesticare un piccolo nano selvaggio appassionato di astri.

 
 
 

Artículos relacionados

    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

    Https://rojas.io/vue-js-server-side-rendering-with-php/ Vue.js Server Side Rendering with 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…

    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…

    Winginx, servidor nginx completo para windows

    Cuando necesitamos montar un servidor Apache en Windows o Mac tenemos opciones de WAMP y MAMP muy populares como por ejemplo XAMPP, pero se hacen mas populares servidores como Nginx.  Nginx…

    Como convertir tus tweets en Feeds RSS

    No hace mucho que Twitter dejó de soportar la funcionalidad que nos permitía de seguir nuestra timeline, nuestro usuarios, etc., gracias a los Feeds RSS. Intentando solucionar el problema, encontré una alternativa óptima :…