我想在Pastebin中从这个HTML中剥离脚本标记:
我尝试使用下面的正则表达式:
html.replace(/<script.*>.*<\/script>/ims, " ")
但它不会删除HTML中的所有脚本标记。它只删除内联脚本。我正在寻找一些正则表达式,可以删除所有的脚本标记(行内和多行)。如果在我的样本http://pastebin.com/mdxygM0a上进行测试,我将非常感激
发布于 2011-07-12 14:09:56
尝试使用正则表达式删除HTML标记是有问题的。你不知道里面的脚本或属性值是什么。一种方法是将其作为div的innerHTML插入,删除所有脚本元素并返回innerHTML,例如
function stripScripts(s) {
var div = document.createElement('div');
div.innerHTML = s;
var scripts = div.getElementsByTagName('script');
var i = scripts.length;
while (i--) {
scripts[i].parentNode.removeChild(scripts[i]);
}
return div.innerHTML;
}
alert(
stripScripts('<span><script type="text/javascript">alert(\'foo\');<\/script><\/span>')
);
请注意,目前,如果使用innerHTML属性插入脚本,浏览器将不会执行该脚本,并且很可能永远不会执行,尤其是因为该元素没有添加到文档中。
发布于 2011-07-12 14:29:52
在某些情况下,jQuery使用正则表达式来删除脚本标记,我敢肯定它的开发人员有一个非常好的理由这样做。可能某些浏览器在使用innerHTML
插入脚本时确实会执行脚本。
下面是正则表达式:
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi
在人们开始叫喊“但是HTML的正则表达式是邪恶的”之前:Yes, they are -但是对于脚本标记,它们是安全的,因为它的特殊行为- <script>
部分可能根本不包含</script>
,除非它应该在这个位置结束。因此,将其与正则表达式相匹配是很容易的。但是,从快速查看上面的正则表达式没有考虑到结束标记中的尾随空格,所以您必须测试</script
、、等是否仍然有效。
发布于 2012-03-28 08:07:45
正则表达式是可以击败的,但是如果您有一个不想注入到DOM中的字符串版本的HTML,那么它们可能是最好的方法。你可能想把它放在一个循环中来处理类似这样的事情:
<scr<script>Ha!</script>ipt> alert(document.cookie);</script>
下面是我使用上面的jquery regex所做的工作:
var SCRIPT_REGEX = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
while (SCRIPT_REGEX.test(text)) {
text = text.replace(SCRIPT_REGEX, "");
}
https://stackoverflow.com/questions/6659351
复制相似问题