Сопоставление с определенным содержимым в HTML-тегах с помощью Regex - PullRequest
1 голос
/ 25 марта 2019

Я хочу сопоставить теги 'script', если он содержит 'bb' внутри, это может быть что угодно между 'bb' и 'script' тегом, включая разрыв строки, поэтому я использую [\s\S]*?

Вот текст, с которым я работаю:

<script>
 aa
</script>
<script>
 bb
</script>
<script>
 cc
</script>

Шаблон: <script>[\s\S]*?bb[\s\S]*?<\/script>

Но это также соответствует тегу 'script' с 'aa' внутри, я пробовал много раз, ноне работает, то как сопоставить теги скрипта только с 'bb' внутри?

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Синтаксический анализ HTML с использованием регулярных выражений не очень хорошая идея, так как он может дать вам неожиданные результаты, когда ваши теги скрипта вложены.

Но на случай, если ваши теги не являются вложенными, вы можете использовать это регулярное выражение, которое будет соответствовать только тегу сценария, содержащему bb внутри него, и не будет охватывать несколько тегов сценария, как это происходит сейчас. В вашем регулярном выражении [\s\S]*? соответствует любому символу, из-за которого он также соответствует последовательным тегам <script>, начиная с первого тега <script>, охватывающего более одного тега <script> для покрытия bb.

<script>(?:(?!<script>)[\s\S])*?bb(?:(?!<script>)[\s\S])*?<\/script>

Это регулярное выражение почти совпадает с вашим регулярным выражением, и единственное, что я сделал, это то, что я изменил [\s\S]*? part на (?:(?!<script>)[\s\S])*? это регулярное выражение, которое не позволяет захватывать несколько тегов <script> в одном совпадении и, следовательно, соответствует только одному тегу скрипта за раз.

Дайте мне знать, если это работает для вас.

Демонстрация в Интернете

0 голосов
/ 25 марта 2019

Просто используйте <script>\s+bb\s+<\/script>

Пояснение:

<script> - соответствует <script> буквально

\ s + бб \ s + - match one or more white spaces with \ s + , match бб literally, again match one or more white spaces with \ s + `

<\/script> - совпадение </script> буквально

Демо

Вы используете [\s\S], что соответствует каждому символу: \s - соответствует любому пробелу, \S - соответствует всему, кроме пробелов. Вот почему ваш шаблон не работает.

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