Я хотел бы удалить HTML-комментарии из некоторого сгенерированного контента.
Если я использую регулярное выражение /<!--(.*?)-->/ (не жадное с ?), то оно работает в большинстве случаев, таких как этот пример:
<!-- <h1> test </h1> --> not remove <!-- <h1> test 2 </h1> -->
Он избавляется от тегов <h1> и оставляет «не удалять» по желанию.
Но если комментарии вложены, то он не обработает их должным образом, так как оставит закрывающий тег последнего комментария '-->'. Обходным решением было бы использование жадного шаблона, но в этом случае он не будет работать для первого случая с несколькими комментариями.
Пример вложенных комментариев (я знаю, что это недопустимый HTML, но его генерирует бэкэнд):
text <!-- something <!-- <p> test </p> --> need remove -->
Я пытался найти решение, но я не знаю, как это решить. Кто-нибудь знает, как с этим справиться?
Да, я знаю, у меня есть php backand, и я смешиваю содержимое в виде строки, поэтому это произошло. вот почему я хочу удалять подобные комментарии
Это проблема XY. Решите настоящую проблему (свою «заднюю часть») вместо решения последующих проблем/симптомов. Если вы выводите фрагменты HTML без проверки (для незаконченных комментариев) или без обзора, тогда улучшите свою логику там.
@BálintBakos: Помогло ли вам мое предложение использовать рекурсивный шаблон в моем ответе? Вам удалось заставить его работать сейчас?






Как вы упомянули, это расстраивает, потому что с нежадным правилом вы решаете один случай, а с жадным правилом вы решаете другой, но вы не можете решить оба одновременно. Что ж, вам повезло, потому что PHP-движок PCRE допускает рекурсию :-)!
Таким образом, проблема может быть решена с помощью магии (?R), которая действует как «Скопируйте и вставьте сюда полный шаблон», как я понял.
Узор будет: /<!--(?:(?!<!--|-->).|(?R))*-->/gs
Вы можете протестировать это здесь: https://regex101.com/r/fZK8VP/1
Объяснение:
<!-- соответствует строке "<!--".
(?: | )* — группа без захвата, которую можно повторять несколько раз
и с двумя вариантами:
А) Первый вариант:
(?!<!--|-->) - это отрицательный прогноз с двумя вариантами ответа
не совпадают, если за ним следует "<!--" или "-->".
. соответствует любому символу.
Б) Второй вариант: (?R) который представляет собой весь шаблон (рекурсия).
--> соответствует строке "-->".
Я использовал модификатор шаблона s, поскольку . также должен соответствовать новым строкам.
если у вас есть комментарии на несколько строк.
HTML не позволяет вкладывать комментарии.