Удалите комментарии из некоторого сгенерированного HTML, которые могут быть недействительными с вложенными комментариями

Я хотел бы удалить HTML-комментарии из некоторого сгенерированного контента. Если я использую регулярное выражение /<!--(.*?)-->/ (не жадное с ?), то оно работает в большинстве случаев, таких как этот пример:

<!-- <h1> test </h1> --> not remove <!-- <h1> test 2 </h1> -->

Он избавляется от тегов <h1> и оставляет «не удалять» по желанию.

Но если комментарии вложены, то он не обработает их должным образом, так как оставит закрывающий тег последнего комментария '-->'. Обходным решением было бы использование жадного шаблона, но в этом случае он не будет работать для первого случая с несколькими комментариями.

Пример вложенных комментариев (я знаю, что это недопустимый HTML, но его генерирует бэкэнд):

text <!-- something <!-- <p> test </p> --> need remove -->

Я пытался найти решение, но я не знаю, как это решить. Кто-нибудь знает, как с этим справиться?

HTML не позволяет вкладывать комментарии.

Quentin 30.01.2023 10:35
Похожие
Dezza 30.01.2023 10:49

Да, я знаю, у меня есть php backand, и я смешиваю содержимое в виде строки, поэтому это произошло. вот почему я хочу удалять подобные комментарии

Bálint Bakos 30.01.2023 11:17

Это проблема XY. Решите настоящую проблему (свою «заднюю часть») вместо решения последующих проблем/симптомов. Если вы выводите фрагменты HTML без проверки (для незаконченных комментариев) или без обзора, тогда улучшите свою логику там.

AmigoJack 30.01.2023 11:28

@BálintBakos: Помогло ли вам мое предложение использовать рекурсивный шаблон в моем ответе? Вам удалось заставить его работать сейчас?

Patrick Janser 31.01.2023 09:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы упомянули, это расстраивает, потому что с нежадным правилом вы решаете один случай, а с жадным правилом вы решаете другой, но вы не можете решить оба одновременно. Что ж, вам повезло, потому что PHP-движок PCRE допускает рекурсию :-)!

Таким образом, проблема может быть решена с помощью магии (?R), которая действует как «Скопируйте и вставьте сюда полный шаблон», как я понял.

Узор будет: /<!--(?:(?!<!--|-->).|(?R))*-->/gs

Вы можете протестировать это здесь: https://regex101.com/r/fZK8VP/1

Объяснение:

  • <!-- соответствует строке "<!--".

  • (?: | )* — группа без захвата, которую можно повторять несколько раз и с двумя вариантами:

    А) Первый вариант:

    • (?!<!--|-->) - это отрицательный прогноз с двумя вариантами ответа не совпадают, если за ним следует "<!--" или "-->".

    • . соответствует любому символу.

    Б) Второй вариант: (?R) который представляет собой весь шаблон (рекурсия).

  • --> соответствует строке "-->".

Я использовал модификатор шаблона s, поскольку . также должен соответствовать новым строкам. если у вас есть комментарии на несколько строк.

Другие вопросы по теме