使用Regex匹配html标记中的特定内容

时间:2019-03-25 12:00:10

标签: php regex

我想匹配'script'标记(如果其中包含'bb',它可以是'bb''script'标记之间的任何内容,包括换行符,所以我使用{{1} }?

以下是我正在处理的文字:

[\s\S]*

模式为:<script> aa </script> <script> bb </script> <script> cc </script>

但这也将<script>[\s\S]*?bb[\s\S]*?<\/script>标记与里面的'script'匹配,我尝试了很多次但没有工作,然后如何匹配仅内部'aa'的脚本标记?

2 个答案:

答案 0 :(得分:0)

只需使用<script>\s+bb\s+<\/script>

说明:

<script>-从字面上匹配<script>

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

<\/script>-从字面上匹配</script>

Demo

您使用[\s\S],它匹配每个字符:\s-匹配任何空格,\S-匹配除空格之外的所有字符。这就是您的模式不起作用的原因。

答案 1 :(得分:0)

使用正则表达式解析HTML不是一个好主意,因为当您的脚本标签嵌套时,它可能会给您带来意想不到的结果。

但是,以防万一您的标签没有嵌套,您可以使用此正则表达式,该正则表达式将仅匹配其中包含bb的脚本标签,并且不会像现在那样跨越多个脚本标签。在您的正则表达式中,[\s\S]*?匹配任何字符,因为它也匹配从第一个<script>标签开始的连续<script>标签,该标签跨越多个<script>标签覆盖{{1} }。

bb

此正则表达式与您的正则表达式几乎相同,唯一不同的是,我将<script>(?:(?!<script>)[\s\S])*?bb(?:(?!<script>)[\s\S])*?<\/script> 部分更改为[\s\S]*?,此正则表达式不允许捕获多个(?:(?!<script>)[\s\S])*?标签一次匹配,因此一次仅匹配一个脚本标签。

让我知道这是否对您有用。

Online Demo