with warning used the supported replacement preg_replace_callback preg_replace php7 longer instead cannot argument php preg-replace symfony-1.4 preg-replace-callback

php - warning - preg_replace_callback(): modifier/e cannot be used with replacement callback



Symfony 1.4 usando funciones obsoletas en php 5.5 (7)

Básicamente, lo que tiene que hacer es tomar el argumento de reemplazo de la llamada preg_replace y factorizarlo en una expresión PHP adecuada, luego hacer de esa expresión el cuerpo de una función que se usará como devolución de llamada para la llamada equivalente preg_replace_callback .

En su caso el código relevante es

return preg_replace(''//-(.)/e'', "''-''.strtoupper(''//1'')", /* input */)

Así que harías eso como

$callback = function($matches) { return ''-''.strtoupper($matches[1]); }; return preg_replace_callback(''//-(.)/'', $callback, /* input */)

Como puede ver, el código de devolución de llamada es el mismo que la expresión de reemplazo original, la única diferencia es que las referencias como //1 se reemplazan con los accesos de matriz como $matches[1] .

Recientemente actualicé PHP de la versión 5.3.27 a 5.5.0. Todo funciona bien en mi proyecto Symfony 2.3.2, y puedo disfrutar de las últimas funcionalidades de PHP.

Ahora, cuando vuelvo a mi otro proyecto Symfony 1.4.16, recibo un error de PHP acerca de que preg_replace está en desuso con el modificador / e.

No puedo encontrar ninguna referencia sobre este error en los foros: ¿Alguien ha tenido este problema antes? ¿Hay algún tipo de parche que pueda aplicar fuera de la caja? ¿Una actualización a Symfony 1.4.20 va a solucionar este problema?

El mensaje de error es así:

En desuso: preg_replace (): El modificador / e está en desuso, use preg_replace_callback en /myproject/lib/vendor/symfony/lib/response/sfWebResponse.class.php en la línea 409

Una forma de proceder puede ser modificar el código como se recomienda en el mensaje y en el manual . ¿Cómo puedo cambiar mi expresión preg_replace a una llamada preg_replace_callback?

Cualquier ayuda / sugerencia será muy bienvenida.

EDITAR:

Hasta la fecha, no hay un parche para esto (y Symfony 1.4.20 no soluciona el problema). La solución es reemplazar las llamadas fallidas a preg_replace con la llamada correspondiente a preg_replace_callback en el sourche, que se realiza fácilmente en la clase sfWebResponse (gracias por la sugerencia de Jon). Ahora, la próxima aparición fallida es un poco más compleja, desafortunadamente ... Y, por otro lado, probablemente tendríamos que grep para los usos de preg_replace con / e para descubrir dónde es probable que Symfony se rompa. Lo que da bastantes resultados: o

Entonces ... Mi conclusión sería que los usuarios de Symfony 1.4 sería mejor no actualizar PHP a la versión 5.5 hasta que salga un parche serio. Qué piensas ? ¿Alguna alternativa?


En definitiva, la mejor solución es evitar actualizar PHP a la versión 5.5, ya que no es más compatible con Symfony 1.4.

Si tienes las versiones de Symfony 2 y 1.4 en un entorno de desarrollo, es posible que desees poder cambiar tu versión de PHP, como se describe muy bien here .

Si realmente lo necesita, es posible configurar dos versiones diferentes de PHP que se ejecutan en el mismo servidor Apache al mismo tiempo: esto necesitará un poco más de configuración, el enlace anterior lo explica también.

Alternativa HOT FIX:

Con un par de actualizaciones en el código de Symfony, puedo hacer que la mayoría de mis páginas web se ejecuten en dev. Por supuesto, sería peligroso aplicar esto en producción, ya que el error "en desuso" puede aparecer nuevamente en cualquier momento, como resultado de otra biblioteca de Symfony.

En myproject / lib / vendor / symfony / lib / response / sfWebResponse.class.php en la línea 409, tengo ahora (el código comentado es el código original de Symfony):

protected function normalizeHeaderName($name) { // return preg_replace(''//-(.)/e'', "''-''.strtoupper(''//1'')", strtr(ucfirst(strtolower($name)), ''_'', ''-'')); return preg_replace_callback( ''//-(.)/'', function ($matches) { return ''-''.strtoupper($matches[1]); }, strtr(ucfirst(strtolower($name)), ''_'', ''-'') ); }

Y en myproject / lib / vendor / symfony / lib / util / sfToolkit.class.php en la línea 362 obtenemos:

public static function pregtr($search, $replacePairs) { // return preg_replace(array_keys($replacePairs), array_values($replacePairs), $search); foreach($replacePairs as $pattern => $replacement) $search = preg_replace_callback( $pattern, function ($matches) use ($replacement){ if(array_key_exists(1, $matches)){ $replacement = str_replace("//1", $matches[1], $replacement);} if(array_key_exists(2, $matches)){ $replacement = str_replace("//2", $matches[2], $replacement);} return $replacement; }, $search ); return $search; }

Úsalo bajo tus propios riesgos :)


FIX alternativo para el método pregtr en / lib / vendor / symfony / lib / util / sfToolkit.class.php en la línea 360

public static function pregtr($search, $replacePairs) { // return preg_replace(array_keys($replacePairs), array_values($replacePairs), $search); foreach($replacePairs as $pattern => $replacement) { if (preg_match(''/(.*)e$/'', $pattern, $matches)) { $pattern = $matches[1]; $search = preg_replace_callback($pattern, function ($matches) use ($replacement) { preg_match("/(''::''/.)?([a-z]*)/(''////([0-9]{1})''/)/", $replacement, $match); return ($match[1]==''''?'''':''::'').call_user_func($match[2], $matches[$match[3]]); }, $search); } else { $search = preg_replace($pattern, $replacement, $search); } } return $search; }


FIX para el método normalizeHeaderName en /lib/vendor/symfony/lib/response/sfWebResponse.class.php en la línea 407

protected function normalizeHeaderName($name) { //return preg_replace(''//-(.)/e'', "''-''.strtoupper(''//1'')", strtr(ucfirst(strtolower($name)), ''_'', ''-''); return str_replace(array(''/'$1$3/''',''/'$2$4/''',''/'$1/''', ''/'$2/''', ''$1'', ''$2''),array(''$matches[1].$matches[3]'',''$matches[2].$matches[4]'',''$matches[1]'',''$matches[2]'',''$matches[1]'',''$matches[2]''), $name); }

FIX para el método pregtr en /lib/vendor/symfony/lib/util/sfToolkit.class.php en la línea 360

public static function pregtr($search, $replacePairs){ // return preg_replace(array_keys($replacePairs), array_values($replacePairs), $search); foreach($replacePairs as $pattern => $replacement) { if (preg_match(''/(.*)e$/'', $pattern, $matches)) { $pattern = $matches[1]; $search = preg_replace_callback($pattern, function ($matches) use ($replacement) { preg_match("/(''::''/.)?([a-z]*)/(''////([0-9]{1})''/)/", $replacement, $match); return ($match[1]==''''?'''':''::'').call_user_func($match[2], $matches[$match[3]]); }, $search); } else { $search = preg_replace($pattern, $replacement, $search); } } return $search; }



Los errores no aparecen en prod a menos que haya habilitado la depuración en index.php . También es posible eliminarlos en dev si se desactiva el indicador E_DEPRECATED en settings.yml :

dev: .settings: error_reporting: <?php echo ((E_ALL | E_STRICT) ^ E_DEPRECATED)."/n" ?>


Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in lib/vendor/symfony/…This changelog will solve the problem for all symfony 1.4.x. Tested on Symfony 1.4.20 --- lib/vendor/symfony/lib/command/sfCommandManager.class.php | 4 +++- lib/vendor/symfony/lib/form/addon/sfFormObject.class.php | 2 +- lib/vendor/symfony/plugins/sfDoctrinePlugin/lib/form/sfFormFilterDoctrine.class.php | 2 +- lib/vendor/symfony/plugins/sfPropelPlugin/lib/form/sfFormFilterPropel.class.php | 2 +- lib/vendor/symfony/lib/response/sfWebResponse.class.php | 2 +- lib/vendor/symfony/lib/util/sfInflector.class.php | 5 +---- lib/vendor/symfony/lib/util/sfToolkit.class.php | 11 +++++++++++ 7 files changed, 19 insertions(+), 9 deletions(-) lib/vendor/symfony/lib/command/sfCommandManager.class.php @@ -108,7 +108,9 @@ class sfCommandManager else if (!is_array($arguments)) { // hack to split arguments with spaces : --test="with some spaces" - $arguments = preg_replace(''/(/'|")(.+?)//1/e'', "str_replace('' '', ''=PLACEHOLDER='', ''//2'')", $arguments); + $arguments = preg_replace_callback(''/(/'|")(.+?)//1/'', function($matches) { + return str_replace('' '', ''=PLACEHOLDER='', $matches[2]); + }, $arguments); $arguments = preg_split(''//s+/'', $arguments); $arguments = str_replace(''=PLACEHOLDER='', '' '', $arguments); } lib/vendor/symfony/lib/form/addon/sfFormObject.class.php @@ -278,6 +278,6 @@ abstract class sfFormObject extends BaseForm protected function camelize($text) { - return preg_replace(array(''#/(.?)#e'', ''/(^|_|-)+(.)/e''), array("''::''.strtoupper(''//1'')", "strtoupper(''//2'')"), $text); + return sfToolkit::camelize($text); } } lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/form/sfFormFilterDoctrine.class.php @@ -323,7 +323,7 @@ abstract class sfFormFilterDoctrine extends sfFormFilter protected function camelize($text) { - return sfToolkit::pregtr($text, array(''#/(.?)#e'' => "''::''.strtoupper(''//1'')", ''/(^|_|-)+(.)/e'' => "strtoupper(''//2'')")); + return sfToolkit::camelize($text); } protected function getTable() lib/vendor/symfony/lib/plugins/sfPropelPlugin/lib/form/sfFormFilterPropel.class.php @@ -263,6 +263,6 @@ abstract class sfFormFilterPropel extends sfFormFilter protected function camelize($text) { - return sfToolkit::pregtr($text, array(''#/(.?)#e'' => "''::''.strtoupper(''//1'')", ''/(^|_|-)+(.)/e'' => "strtoupper(''//2'')")); + return sfToolkit::camelize($text); } } lib/vendor/symfony/lib/response/sfWebResponse.class.php @@ -406,7 +406,7 @@ class sfWebResponse extends sfResponse */ protected function normalizeHeaderName($name) { - return preg_replace(''//-(.)/e'', "''-''.strtoupper(''//1'')", strtr(ucfirst(strtolower($name)), ''_'', ''-'')); + return preg_replace_callback(''//-(.)/'', function ($matches) { return ''-''.strtoupper($matches[1]); }, strtr(ucfirst(strtolower($name)), ''_'', ''-'')); } /** lib/vendor/symfony/lib/util/sfInflector.class.php @@ -28,10 +28,7 @@ class sfInflector public static function camelize($lower_case_and_underscored_word) { $tmp = $lower_case_and_underscored_word; - $tmp = sfToolkit::pregtr($tmp, array(''#/(.?)#e'' => "''::''.strtoupper(''//1'')", - ''/(^|_|-)+(.)/e'' => "strtoupper(''//2'')")); - - return $tmp; + return sfToolkit::camelize($tmp);; } /** lib/vendor/symfony/lib/util/sfToolkit.class.php @@ -608,4 +608,15 @@ class sfToolkit return set_include_path(join(PATH_SEPARATOR, $paths)); } + + public static function camelize($text) + { + if (preg_match(''#/(.?)#'', $text, $matches)) { + $text = str_replace($matches[0], ''::''.strtoupper($matches[1]), $text); + } + if (preg_match(''/(^|_|-)+(.)/'', $text, $matches)) { + $text = str_replace($matches[0], strtoupper($matches[2]), $text); + } + return $text; + } } --