使用点匹配时正则表达式不会停止

时间:2016-06-01 20:59:47

标签: php html regex dom pattern-matching

我想从包含单词" site"

的页面中删除一些脚本
<scritp>
o.com
bla bla bla
</script><p>this is line></p>

<script>
google.com/jquery.js !
</script>

<scritp>
site.com
bla bla bla
</script><p>aa</p>

CONTENT
STYLE
SIDEBAR
...


<scritp>
site.com
aaa bla bla bla
</script><p>a</p>

我使用以下正则表达式:

<scritp>.*?site.*?<\/script>

但它包含与匹配无关的行。

调试链接:https://regex101.com/r/rC0vF8/2

我找到匹配项时如何停止:</script>

我希望一次匹配所有<script>site.com</script>

2 个答案:

答案 0 :(得分:1)

令人困惑的是,您的样本中有一些scritp和一些script演示。这是什么意思?但是,如果这对您的输入很方便,则可以使用negative lookahead

<script>((?!</script).)*?site(?1)*</script>
  • ((?!</script).)*?匹配lazily任意数量的任何字符,</script未提前
  • 直至site(?1)* reuses模式首先group,直至</script>贪婪。

更多解释和demo at regex101

对于这类问题,通常首选parser解决方案。取决于输入。

答案 1 :(得分:0)

请改用此正则表达式:/<scritp>\nsite.*?<\/script>/gsi

您的正则表达式会获取第一个<script>,然后是site.*,然后是</script>