我需要删除几个页面中的网址。它以几种不同的方式实现,例如脚本源,在脚本中用作变量或在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>
我的错误在哪里?
惰性量词不会向后工作,因为文本是从左到右读取的。这种工作方式是,第一个<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] 删除。
我来说两句