Задать вопрос
@alexh7854

Как ускорить выполнение preg_replace (в массиве 100 паттернов)?

Здравствуйте.

Я обрабатываю текст через регулярные выражения в php, использую функцию preg_replace.
Передаю в функцию массивы с паттернами, массив с заменами и текст.

В массивах с паттернами и заменами около 100 элементов. Пример паттерна - #(\b{$word}\b)[\s$](?![^<]*>|[^<>]*<\/)#ui".

Сейчас функция отрабатывает секунд за 5, что слишком медленно.

Можно ли как-то ускорить / оптимизировать?
  • Вопрос задан
  • 136 просмотров
Подписаться 1 Простой 8 комментариев
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker
Программист, энтузиаст
Так себе идея обрабатывать теги регулярками, но...
Пощупать вашу проблему я не могу ввиду страшной аллергии к ПХП.
Могу предложить ряд оптимизацией обобщенного характера.
  1. Проанализировать регулярки, найти зависимости и "скомпилировать" их в одну регулярку или небольшую группу из нескольких. Обрабатывать регулярки можно эвентуально. То есть дополнительно анализировать матчи программно и в зависимости от контекста подставлять соответствующую замену. Ещё можно пир компиляции регулярок в одну поименовать группы уникально так, чтобы по имени проматченной группы можно было найти нужную замену в словаре замен.
  2. Если замены более-менее однотипные, например одни теги заменяются на другие, то можно вообще построить общую универсальную простую регулярку на тег, а программно смотреть по словарю чему соответствует матч и делать нужную замену.

Эти оптимизации позволят сделать замены за число проходов, которое не кратно числу регулярок, которых много. В идеале за один проход.

Вообще, система, построенная на высокочастотной обработке большого текста сотней регулярок явно спроектирована как-то неправильно. Как выше сказали, наверняка эту проблему надо было решать в другом месте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
26 дек. 2024, в 15:04
3000 руб./за проект
26 дек. 2024, в 14:50
2000 руб./за проект
26 дек. 2024, в 14:40
15000 руб./за проект