【问题标题】:Match with specific content within html tags using Regex使用正则表达式匹配 html 标签中的特定内容
【发布时间】:2019-08-15 15:59:51
【问题描述】:

如果里面包含'bb',我想匹配'script'标签,它可以是'bb''script'标签之间的任何内容,包括换行符,所以我使用[\s\S]*

这是我正在处理的文本:

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

模式为:&lt;script&gt;[\s\S]*?bb[\s\S]*?&lt;\/script&gt;

但是这也匹配了'script'标签里面有'aa',我试了很多次还是不行,那如何匹配里面只有'bb'的脚本标签呢?

【问题讨论】:

  • pattern: /&lt;\s*script[^&gt;]*&gt;(.*?)&lt;\s*\/\s*script&gt;/gi 然后查看内容
  • @Seblor 确实如此,尽管正则表达式仍可用于像提供的一个 OP 这样的简单文本
  • @GrafiCodeStudio 它什么都不匹配。

标签: php regex


【解决方案1】:

只需使用&lt;script&gt;\s+bb\s+&lt;\/script&gt;

解释:

&lt;script&gt; - 匹配 &lt;script&gt; 字面意思

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

&lt;\/script&gt; - 匹配 &lt;/script&gt; 字面意思

Demo

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

【讨论】:

  • 我的模式工作了一半,它从第一个错误的“脚本”标签匹配,但以正确的脚本标签结束,我想从第二个“脚本”标签开始匹配。我使用 \s\S 因为它可能不止一个字符(包括空格)
【解决方案2】:

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

但万一你的标签没有嵌套,你可以使用这个正则表达式,它将只匹配其中包含bb 的脚本标签,并且不会像现在发生的那样跨越多个脚本标签。在您的正则表达式中,[\s\S]*? 匹配任何字符,因为它也匹配从第一个 &lt;script&gt; 标记开始的连续 &lt;script&gt; 标记,跨越多个 &lt;script&gt; 标记以覆盖 bb

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

此正则表达式与您的正则表达式几乎相同,唯一不同的是,我已将 [\s\S]*? 部分更改为 (?:(?!&lt;script&gt;)[\s\S])*? 此正则表达式不允许在单个匹配中捕获多个 &lt;script&gt; 标签,因此一次只匹配一个脚本标签。

让我知道这是否适合你。

Online Demo

【讨论】:

  • 有效!这是使用前瞻,我需要尝试,现在正在工作!
  • @Dew:很高兴知道它对你很有效。另外请考虑接受这个答案,这会给你+2代表,并且可能有助于其他人关注类似问题的答案。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多