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

Тема в разделе "PHP", создана пользователем usergeyv, 12 окт 2016.

Статус темы:
Закрыта.
Модераторы: latteo
  1. usergeyv

    usergeyv Постоялец

    Регистр.:
    5 июл 2013
    Сообщения:
    143
    Симпатии:
    22
    Помогите исправить ошибку:
    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>";
                 
                }
     
  2. Casper_R

    Casper_R Создатель

    Регистр.:
    3 май 2007
    Сообщения:
    87
    Симпатии:
    31
    оставь только эти модификаторы - #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>";
     
    usergeyv нравится это.
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.611
    Симпатии:
    1.539
    Только можно сломать логику скрипта и даже безопасность, как это ни странно звучит в данном случае:
    На самом деле данный модификатор является небезопасным и по-возможности от него надо избавляться, вот его и сделали deprecated, а в будущем полностью удалят.

    Просто удалить недостаточно - после удаления надо просмотреть все возможные варианты входных данных и убедится что там нет php кода.
     
    usergeyv и Sorcus нравится это.
  4. Den1xxx

    Den1xxx

    Moderator
    Регистр.:
    15 янв 2014
    Сообщения:
    280
    Симпатии:
    155
    Скорее всего есть, да и просто убрав модфикатор — будет неправильно работать. Можно тогда делать eval() после preg_rplace, после того как убран модификатор e
    Код:
    $title[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#is","'\\1'",$title[1]);
    $title[1]=eval(addslashes($title[1]));
    Это будет аналогично preg_replace с модификатором e — http://php.net/manual/ru/reference.pcre.pattern.modifiers.php
    Но нужно ещё точно знать, что входной параметр $title[1] — строка.
    Если он массив, сделать foreach по массиву с этим же выражением.

    А вообще, когда видишь такой код, нужно задать себе вопрос, как этого избежать.
     
    usergeyv нравится это.
  5. Casper_R

    Casper_R Создатель

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

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