Захват HTML-комментариев с использованием Regex, но игнорирование определенного комментария - PullRequest
3 голосов
/ 04 апреля 2019

Я хочу записать html-комментарии, за исключением конкретного комментария, т.е.

 <!-- end-readmore-item --> 

В настоящее время я могу успешно захватить все комментарии HTML, используя регулярное выражение ниже,

(?=<!--)([\s\S]*?)-->

Чтобы проигнорировать указанный комментарий, я попробовал предвидение и предпросмотр утверждений, но, будучи новичком на продвинутом уровне Regex, я, вероятно, что-то упустил.

До сих пор я смог разработать следующее регулярное выражение, используя lookarounds,

^((?!<!-- end-readmore-item -->).)*$

Я ожидаю, что он проигнорирует комментарий end-readmore-item и захватит только другие комментарии, такие как,

<!-- Testing-->

Тем не менее, он выполняет свою работу, но также фиксирует обычные теги HTML, которые я также хочу игнорировать.

Я использовал следующий HTML-код в качестве контрольного примера,

<div class="collapsible-item-body" data-defaulttext="Further text">Further 
text</div>
<!-- end-readmore-item --></div>
</div>
&nbsp;<!-- -->
it only should match with <!-- --> but it's selecting everything except <!-- 
end-readmore-item -->
the usage of this is gonna be to remove all the HTML comments except <!-- 
end-readmore-item -->

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Вы можете использовать следующий шаблон:

<!--(?!\s*?end-readmore-item\s*-->)[\s\S]*?-->

Regex101 demo .

Разбивка:

<!--                    # Matches `<!--` literally.
(?!                     # Start of a negative Lookahead (not followed by).
    \s*                 # Matches zero or more whitespace characters.
    end-readmore-item   # Matches literal string.
    \s*                 # Matches zero or more whitespace characters.
    -->                 # Matches `-->` literally.
)                       # End of the negative Lookahead.
[\s\S]*?                # Matches any character zero or more time (lazy match), 
                        # including whitespace and non-whitespace characters.
-->                     # Matches `-->` literally.

Что в основном означает:

Совпадение <!--, то есть , а не , за которым следует [пробел * + end-readmore-item +другой пробел * + -->], который равен , за которым следует любое количество символов, затем сразу следует -->.


* необязательный пробел повторяется ноль или более раз.

1 голос
/ 04 апреля 2019

Вы очень близки с вашим отрицательным прогнозом, вам просто нужно изменить его следующим образом:

<!--((?!end-readmore-item).)*?-->

Где *? сопоставляется не жадно.

Это будет соответствовать всем комментариям, кроме тех, которые содержат строку end-readmore-item внутри тела комментария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...