Ошибка Deprecated: preg_replace(): The /e modifier is deprecated.......

Статус
В этой теме нельзя размещать новые ответы.

usergeyv

Знаток
Регистрация
5 Июл 2013
Сообщения
152
Реакции
25
Помогите исправить ошибку:
HTML:
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in

Вот часть кода:
PHP:
{
             $title[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$title[1]);
             $link[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$link[1]);
             $description[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$description[1]);
             
             if ( $date_is )
               $date = strtotime($date_t[1]);
             
             
             $t.="<div><a href='".$link[1]."' target='_blank'>".$title[1]."</a>
              <br>"
              .$description[1]
              .( $date ? "<br>".date("d.n.Y",$date) : "" )
              ."</div>";
             
            }
 
оставь только эти модификаторы - #is
PHP:
$title[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#is","'\\1'",$title[1]);
             $link[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#is","'\\1'",$link[1]);
             $description[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#is","'\\1'",$description[1]);
             
             if ( $date_is )
               $date = strtotime($date_t[1]);
             
             
             $t.="<div><a href='".$link[1]."' target='_blank'>".$title[1]."</a>
              <br>"
              .$description[1]
              .( $date ? "<br>".date("d.n.Y",$date) : "" )
              ."</div>";
 
оставь только эти модификаторы - #is

Только можно сломать логику скрипта и даже безопасность, как это ни странно звучит в данном случае:
http://php.net/manual/ru/reference.pcre.pattern.modifiers.php написал(а):
e (PREG_REPLACE_EVAL)
Данная возможность была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.5.0. Крайне не рекомендуется полагаться на эту возможность в будущем.
Если используется данный устаревший модификатор, preg_replace() после выполнения стандартных подстановок в заменяемой строке интерпретирует ее как PHP-код и использует результат для замены искомой строки. Одинарные и двойные кавычки, обратные слеши (\) NULL-символы будут проэкранированы обратными слешами в подставляемых обратных ссылках.
На самом деле данный модификатор является небезопасным и по-возможности от него надо избавляться, вот его и сделали deprecated, а в будущем полностью удалят.

Просто удалить недостаточно - после удаления надо просмотреть все возможные варианты входных данных и убедится что там нет php кода.
 
Просто удалить недостаточно - после удаления надо просмотреть все возможные варианты входных данных и убедится что там нет php кода.
Скорее всего есть, да и просто убрав модфикатор — будет неправильно работать. Можно тогда делать eval() после preg_rplace, после того как убран модификатор e
Код:
$title[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#is","'\\1'",$title[1]);
$title[1]=eval(addslashes($title[1]));
Это будет аналогично preg_replace с модификатором e — Для просмотра ссылки Войди или Зарегистрируйся
Но нужно ещё точно знать, что входной параметр $title[1] — строка.
Если он массив, сделать foreach по массиву с этим же выражением.

А вообще, когда видишь такой код, нужно задать себе вопрос, как этого избежать.
 
Только можно сломать логику скрипта и даже безопасность
ну что вы сразу страху на человека нагоняете? )
Я уверен, это обычный XML парсер. И слабо себе представляю необходимость php кода во входящих данных для этой задачи. Там же просто ссылки генерятся.
Мне больше кажется, что это типичный пример говнокода, когда разраб где-то урвал пример preg_replace'a с этими модификаторами и везде их использует без понимания, что они вообще значат.

А товарищ ТС пусть просто попробует, все ли работает и не забивает голову ерундой с переписыванием кода под eval() :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху