Ken*_*edy 59 html javascript regex
我想在pastebin中从这个html中删除脚本标签
我尝试使用下面的正则表达式
html.replace(/<script.*>.*<\/script>/ims, " ")
Run Code Online (Sandbox Code Playgroud)
但它不会删除html中的所有脚本标记.它只删除内联脚本.请我需要一个可以删除所有脚本标签的正则表达式(内联和多行).如果对我的样本http://pastebin.com/mdxygM0a进行测试,我们将非常感激
谢谢
Thi*_*ter 102
在某些情况下,jQuery使用正则表达式删除脚本标记,我很确定它的开发人员有这么好的理由.可能有些浏览器在使用时插入它们会执行脚本innerHTML
.
这是正则表达式:
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi
Run Code Online (Sandbox Code Playgroud)
在人们开始哭泣之前"但HTML的正则表达是邪恶的":是的,它们是 - 但对于脚本标签,由于特殊行为,它们是安全的 - 除非它应该在此位置结束,否则<script>
部分可能根本不包含</script>
.因此很容易将它与正则表达式匹配.但是,从快速查看,上面的正则表达式不会考虑结束标记内的尾随空格,因此您必须测试是否</script
仍然有效.
Rob*_*obG 85
尝试使用正则表达式删除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>')
);
Run Code Online (Sandbox Code Playgroud)
请注意,目前,如果使用innerHTML属性插入,浏览器将不会执行脚本,并且可能永远不会特别是因为元素未添加到文档中.
小智 44
正则表达式是可以打败的,但是如果你有一个HTML的字符串版本,你不想注入DOM,它们可能是最好的方法.您可能希望将其置于循环中以处理类似于:
<scr<script>Ha!</script>ipt> alert(document.cookie);</script>
Run Code Online (Sandbox Code Playgroud)
这是我做的,使用上面的jquery正则表达式:
var SCRIPT_REGEX = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
while (SCRIPT_REGEX.test(text)) {
text = text.replace(SCRIPT_REGEX, "");
}
Run Code Online (Sandbox Code Playgroud)
spa*_*ark 13
这个正则表达式也应该工作:
<script(?:(?!\/\/)(?!\/\*)[^'"]|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\/\/.*(?:\n)|\/\*(?:(?:.|\s))*?\*\/)*?<\/script>
Run Code Online (Sandbox Code Playgroud)
它甚至允许在内部具有"有问题"的变量字符串:
<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>
Run Code Online (Sandbox Code Playgroud)
它接缝jQuery和Prototype在这些上失败了......
编辑17年7月31日:添加了a)非捕获组以获得更好的性能(并且没有空组)和b)支持JavaScript注释.
neo*_*rau 10
每当你不得不求助于基于Regex的脚本标记清理时.至少在结尾标记中添加一个空格
</script\s*>
Run Code Online (Sandbox Code Playgroud)
否则就像
<script>alert(666)</script >
Run Code Online (Sandbox Code Playgroud)
标记名有效后,因为尾随空格会保留.
如果您想从某些 HTML 文本中删除所有 JavaScript 代码,那么删除<script>
标签是不够的,因为 JavaScript 仍然可以存在于“onclick”、“onerror”、“href”和其他属性中。
试试这个处理所有这些的 npm 模块: https ://www.npmjs.com/package/strip-js