The e modifier is deprecated

The e modifier is deprecated

I run an open source project which is hosted on github. I’m currently about to release a new version which is running on PHP 7. This is where I’m needing help. I’m fairly strong with majority of PHP functions and equally comfortable with mysqli but in all my time running my project I’ve never worked with regex. I have two patterns with the now defunct /e modifier in use and have no idea how to fix them, so I’m hoping by asking the question here to actually learn something and also fix my problems.

Problem one is coming from one preg_replace I used for Geshi syntax highlighter for code tag.

The second one handles media tags like liveleak etc:

Both are not working and throwing this error:

PHP Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead.

Trouble is I have no idea how to work with regex, I’ve tried using tutorials over the past few weeks and still don’t really understand it, any help would be really appreciated.

1 Answer 1

The PHP manual describes the modifier this way: (emphasis mine)

If this deprecated modifier is set, preg_replace() does normal substitution of backreferences in the replacement string, eval s it as PHP code(!!), and uses the result for replacing the search string. Single quotes, double quotes, backslashes () and NULL chars will be escaped by backslashes in substituted backreferences.

First of all, the very concept of this modifier was always evil. It included an eval case into source-code, the existence of which was usually overlooked and therefore quite easily exploited.

Читайте также:  Ms sql сегодняшняя дата

The online PHP documentation . http://php.net/manual/en/reference.pcre.pattern.modifiers.php . talks very extensively about this modifier, why it is evil, and specifically how to use preg_replace_callback() to replace it.

Let’s take your first regex, the one for "Geshi syntax":

This could be replaced by something like:

After the regex has been evaluated against the string and the matching groups (if any) have been identified, the array is handed to the callback. (The array looks like the one returned by a normal match.) The value returned by the callback is the final replacement string.

Now, the presence of an executable subroutine is made explicit, and it becomes impossible for a clever L33T H4X0R to influence what it consists of or to inject arbitrary code.

Furthermore, it’s much more flexible. You can, after all, insert an entire subroutine. (It can be an anonymous one, as shown, or it can be a reference to a subroutine that’s used many times.)

Frankly, the /e modifier was a bad idea that won’t be missed . . . Callbacks do the same thing, and much more.

Есть сайт на joomla.
Появились ошибки:

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/ox2281/htdocs/libraries/joomla/filter/input.php on line 652

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/ox2281/htdocs/libraries/joomla/filter/input.php on line 654

строка 652: $source = preg_replace(‘/&#(d+);/me’, "utf8_encode(chr(\1))", $source); // decimal notation

строка 654: $source = preg_replace(‘/&#x([a-f0-9]+);/mei’, "utf8_encode(chr(0x\1))", $source); // hex notation

Сайт лежит. Вместо него крокозяблы.

Может подскажете, как исправить?

Знаю. что preg_replace(): является устаревшим, и нужно использовать preg_replace_callback, но не знаю как переписать приведенные строчки.

PunBB.INFO → Bug reports → Ошибка PHP Deprecated: preg_replace(): The /e modifier is deprecated

Читайте также:  Heroes of might and magic 7 отзывы

Posts: 11

1 Topic by YT007 2016.02.26 23:02

  • YT007
  • Member
  • Offline
  • More info

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

    Вылезла ошибка после перехода на PunBB 1.4.3
    PHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/f/366_281/***.com/public_html/forum/include/parser.php on line 807

    Почитав немного инфы, я пришел к выводу, что нужно заменить старую функцию на новую. Достаточно просто заменить функцию или же нужно всю регулярку целиком переписывать? Кто вкурсе?

    2 Reply by PunBB 2016.02.27 00:16 (edited by 2016.02.27 00:17)

  • PunBB
  • Admin
  • Offline
  • More info

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

    YT007, либо обновлять до 1_4_4 либо откатить версию php. Вроде она должна быть не выше 5.5. Напишите тикет вашему хостеру, мол какая версия еще поддерживает эту функцию

    Модификатор /e теперь считается устаревшим. Используйте функцию preg_replace_callback(). Смотрите документацию PREG_REPLACE_EVAL с дополнительной информацией и описанием проблем с безопасностью.

    3 Reply by YT007 2016.02.27 00:41

  • YT007
  • Member
  • Offline
  • More info

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

    Обновил до 1.4.4 версии, теперь сообщения куда то пропали! Как такое может быть?

    4 Reply by PunBB 2016.02.27 01:08

  • PunBB
  • Admin
  • Offline
  • More info

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

    Обновил до 1.4.4 версии, теперь сообщения куда то пропали! Как такое может быть?

    видимо какое либо расширение все еще использует модификатор и не адаптировано под 1_4_4. Отключайте по очереди, как только текст появится, значит его мусолить и нужно.

    5 Reply by YT007 2016.02.27 01:19

  • YT007
  • Member
  • Offline
  • More info

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

    Fancy Video Tag • Версия 0.4.11.1 • Разработчик: dimka.linux@gmail.com
    вот это расширение отключил, текст появился
    Спасибо вам большое!
    Теперь второй вопрос, как теперь переписать расширение, чтобы оно заработало? или есть какой нибудь аналог?
    просто, у меня на форуме так же куча видеоклипов из ютуба.

Ссылка на основную публикацию
Adblock detector