regex — PHP Как установить для preg-групп значение «non-capture» (?: …)

На странице HTML я удаляю комментарии HTML вот так

$contentHTML = preg_replace("#(?=<!--)([\s\S]*?)-->#", "", $contentHTML);

Но на огромной странице для preg_replace, Я получил «Неустранимая ошибка PHP: допустимый объем памяти …«

Возможно, одно из решений будет использовать несоответствующую группу, чтобы избежать захвата текста?
Может ли кто-нибудь объяснить, как использовать группу соответствия ?:

Или как я могу подавить комментарии HTML на огромной странице без preg_replace?

1

Решение

Просто разверните регулярное выражение как

$contentHTML = preg_replace("#<!--[^-]*(?:-(?!->)[^-]*)*-->#", "", $contentHTML);

Увидеть regex demo. Comapre с ваш делая примерно в 3 раза больше шагов, чем мой, с очень коротким примером.

Подробности:

  • <!-- — начало комментария
  • [^-]* — 0+ не-
  • (?:-(?!->)[^-]*)* — 0+ последовательностей - это не сопровождается -> а затем 0+ не-s
  • --> — конец комментария
2

Другие решения

Других решений пока нет …