Удалите htmlentities (. *) Из кода с помощью PCRE - PullRequest
0 голосов
/ 14 января 2019

Я мигрирую старую кодовую базу в новую базу данных, которая находится в UTF-8. Я также использую Eloquent, поэтому мне больше не нужно беспокоиться о внедрении SQL.

После преобразования всего содержимого базы данных в UTF-8 и удаления HTML-сущностей мне нужно удалить каждый вызов htmlentities. Итак, я написал это:

htmlentities\s*\(
(?<e>[^()]*(?:\((?&e)\)[^()]*?)*)
(?:,\s*ENT_\w+)?
(?:\s*\,'UTF-8')?
\)

https://regex101.com/r/2RpH3L/2

Мое регулярное выражение слишком жадное и работает не так, как ожидалось. Например:

htmlentities(foobar(), ENT_QUOTE, 'UTF-8');
             ^--------------------------^ Match this
             ^------^ Instead of this

Я мог бы выполнить эту работу в два этапа с помощью Perl:

perl -pi -e '\
    s/htmlentities\s*\((?<e>[^()]*(?:\((?&e)\)[^()]*?)*)\)/\
       s@^(.*?)(?:,\s*(?:ENT_\w+|'UTF-8')\s*)*$@$1@\
    /gme

Есть ли способ сделать это простым PCRE?

...