Вы обрабатываете каждый файл пять раз, поэтому первое, что вы должны сделать (как сказал Пол Санвальд), это попытаться уменьшить это число путем объединения ваших регулярных выражений. Я бы также не использовал квантификаторы с неохотой, которые созданы для удобства за счет эффективности. Рассмотрим это регулярное выражение:
<script.*?</script>
Каждый раз, когда .
использует другого персонажа, сначала он должен убедиться, что </script>
не будет совпадать в этом месте. Это почти то же самое, что негативно смотреть на каждую позицию:
<script(?:(?!</script>).)*</script>
Но мы знаем, что нет смысла делать заглядывание вперед, если следующий символ - что-то кроме <
, и мы можем соответствующим образом настроить регулярное выражение:
<script[^<]*(?:<(?!/script>)[^<]*)*</script>
Когда я проверяю их в RegexBuddy с этой целевой строкой:
<script type="text/javascript">var imagePath='http://sstatic.net/stackoverflow/img/';</script>
... неохотное регулярное выражение делает 173 шага, чтобы сделать совпадение, в то время как специализированное регулярное выражение занимает только 28.
Объединение ваших первых трех регулярных выражений в одно дает этого зверя:
<(?:(script|style)[^<]*(?:<(?!/\1)[^<]*)*</\1>|[!/]?[a-zA-Z-]+[^<>]*>)
Возможно, вы захотите убрать элемент <HEAD>
, пока вы на нем (т. Е. (script|style|head)
).
Я не знаю, что вы делаете с четвертым регулярным выражением для сущностей персонажей - вы тоже просто удаляете их? Я предполагаю, что пятое регулярное выражение должно быть запущено отдельно, так как некоторые из пробелов, которые он очищает, генерируются более ранними шагами. Но попробуйте это с первыми тремя объединенными регулярными выражениями и посмотрите, насколько это важно. Это должно сказать вам, стоит ли идти вперед с таким подходом.