PHP Как установить preg-группы без захвата (?:)

На HTML-странице я удаляю HTML-комментарии, подобные этому

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

Но на огромной странице для preg_replace я получил "Неустранимая ошибка PHP: допустимый размер памяти..."

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

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


person LeMoussel    schedule 27.04.2016    source источник


Ответы (1)


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

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

См. демонстрацию регулярного выражения. Сравните с вашими шагами примерно в 3 раза больше, чем у меня, на очень коротком примере.

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

  • <!-- - начало комментария
  • [^-]* - 0+ не--
  • (?:-(?!->)[^-]*)* - 0+ последовательностей -, за которыми не следует ->, а затем 0+ не--s
  • --> - конец комментария
person Wiktor Stribiżew    schedule 27.04.2016