我想在 Pastebin 中从这个 HTML 中去除脚本标签:
我尝试使用以下正则表达式:
html.replace(/<script.*>.*<\/script>/ims, " ")
但它不会删除 HTML 中的所有脚本标记。它只删除内嵌脚本。我正在寻找一些可以删除所有脚本标签(内联和多行)的正则表达式。如果对我的样本进行测试http://pastebin.com/mdxygM0a将不胜感激
我想在 Pastebin 中从这个 HTML 中去除脚本标签:
我尝试使用以下正则表达式:
html.replace(/<script.*>.*<\/script>/ims, " ")
但它不会删除 HTML 中的所有脚本标记。它只删除内嵌脚本。我正在寻找一些可以删除所有脚本标签(内联和多行)的正则表达式。如果对我的样本进行测试http://pastebin.com/mdxygM0a将不胜感激
在某些情况下,jQuery 使用正则表达式来删除脚本标签,我很确定它的开发人员有充分的理由这样做。也许有些浏览器不使用时插入其中执行脚本innerHTML
。
这是正则表达式:
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi
在人们开始哭泣“但是 HTML 的正则表达式是邪恶的”之前:是的,它们是- 但是对于脚本标签,由于特殊行为,它们是安全的 - 一个<script>
部分可能根本不包含</script>
,除非它应该在这个位置结束。因此很容易将它与正则表达式匹配。但是,快速浏览一下,上面的正则表达式没有考虑结束标签内的尾随空格,因此您必须测试</script
等是否仍然有效。
尝试使用正则表达式删除 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 属性插入,浏览器将不会执行脚本,并且可能永远不会执行,特别是因为该元素未添加到文档中。
正则表达式是可以击败的,但是如果您不想将 HTML 的字符串版本注入到 DOM 中,那么它们可能是最好的方法。你可能想把它放在一个循环中来处理类似的事情:
<scr<script>Ha!</script>ipt> alert(document.cookie);</script>
这是我所做的,使用上面的 jquery 正则表达式:
var SCRIPT_REGEX = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
while (SCRIPT_REGEX.test(text)) {
text = text.replace(SCRIPT_REGEX, "");
}
这个正则表达式也应该工作:
<script(?:(?!\/\/)(?!\/\*)[^'"]|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\/\/.*(?:\n)|\/\*(?:(?:.|\s))*?\*\/)*?<\/script>
它甚至允许在内部包含“有问题的”变量字符串:
<script type="text/javascript">
var test1 = "</script>";
var test2 = '\'</script>';
var test1 = "\"</script>";
var test1 = "<script>\"";
var test2 = '<scr\'ipt>';
/* </script> */
// </script>
/* ' */
// var foo=" '
</script>
看来 jQuery 和 Prototype 在这些方面失败了......
2017 年 7 月 31 日编辑:添加了 a) 非捕获组以获得更好的性能(并且没有空组)和 b) 对 JavaScript 注释的支持。
每当您不得不求助于基于正则表达式的脚本标记清理时。至少以以下形式在结束标记中添加一个空格
</script\s*>
否则像
<script>alert(666)</script >
将保留,因为标记名后的尾随空格有效。