php lazy regex不表现懒惰

粉丝出品

我需要删除几个页面中的网址。它以几种不同的方式实现,例如脚本源,在脚本中用作变量或在noscript标记中使用img src。

我编写了以下正则表达式来解决此问题:

/<[no]*script[\s\S]+?www.badurl.com[\s\S]+?<\/[no]*script>/i

问题是,它不会一直表现得很懒。

在下面的示例中,它应该仅选择最后一个脚本块,但同时选择两者:

<script type="text/javascript">
var stuff = {"foo":"bar"}foo.c(stuff,1);
</script>

<script type="text/javascript">
<!--
var foo="http://www.badurl.com/cgi-bin/;[comment]";
document.write("<img src=\""+bar+"?r="+escape(document.referrer)+"&d="+(Math.random()*100000)+"\" width=\"1\" height=\"1\" alt=\"foobar\" />");
//-->
</script>

我的错误在哪里?

安德里斯·莱杜斯克拉斯特(Andris Leduskrasts)

惰性量词不会向后工作,因为文本是从左到右读取的。这种工作方式是,第一个<script是正则表达式开始匹配您的内容的地方,它可以匹配,因为在出​​现任意数量的字符badurl链接之后,其余的都按您认为的那样工作。

您在这里处理的是HTML / php的部分解析,因此并不是真的不是小菜一碟,而且通常不建议这样做。重命名正则表达式:<(no)?script([\s\S](?!<\/(no)?script))+www.badurl.com[\s\S]*?<\/(no)?script>,如https://regex101.com/r/uE9lZ8/3所示不过,这应该可行,只要您在每个字符之后都没有</script>标签,就可以匹配每个字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章