用JS正则expression式从html中删除所有脚本标记
我想在pastebin中去掉这个html的脚本标签
http://pastebin.com/mdxygM0a
我尝试使用下面的正则expression式
html.replace(/<script.*>.*<\/script>/ims, " ")
但是它不会删除html中的所有脚本标签。 它只会删除内联脚本。 请我需要一个正则expression式,可以删除所有的脚本标签(内联和多行)。 如果在我的样本http://pastebin.com/mdxygM0a上进行testing,我们将非常感激
谢谢
尝试使用正则expression式删除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属性插入,浏览器将不会执行该脚本,并且可能永远不会特别因为该元素未被添加到文档中。
在某些情况下,jQuery使用正则expression式去除脚本标签,我很确定它的开发者有一个很好的理由这样做。 可能有些浏览器在使用innerHTML
插入时执行脚本。
这是正则expression式:
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi
在人们开始哭泣之前,“但HTML的正则expression式是邪恶的”: 是的,它们是 – 但是对于脚本标记,由于特殊的行为,它们是安全的 – 一个<script>
部分可能根本不包含</script>
在这个位置。 所以匹配正则expression式很容易。 然而,从上面的正则expression式不会考虑结束标签内的尾随空白,所以你必须testing</script
等是否仍然有效。
正则expression式是可打败的,但是如果你有一个你不想注入DOM的string版本的HTML,他们可能是最好的方法。 你可能想把它放在一个循环中来处理这样的事情:
<scr<script>Ha!</script>ipt> alert(document.cookie);</script>
这是我做的,使用上面的jQuery正则expression式:
var SCRIPT_REGEX = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi; while (SCRIPT_REGEX.test(text)) { text = text.replace(SCRIPT_REGEX, ""); }
这正则expression式也应该工作:
<script(?:(?!\/\/)(?!\/\*)[^'"]|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\/\/.*(?:\n)|\/\*(?:(?:.|\s))*?\*\/)*?<\/script>
它甚至允许有像这些“有问题”的variablesstring:
<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和原型失败这些…
编辑7月31日'17:增加了a)非捕获组更好的性能(和没有空组),b)支持JavaScript评论。
每当你不得不求助于基于正则expression式的脚本标签清理。 至less在结尾标签中添加一个空格,格式为
</script\s*>
否则事情就像
<script>alert(666)</script >
在标记名有效后尾随空格。
为什么不使用jQuery.parseHTML() http://api.jquery.com/jquery.parsehtml/ ?
在我的情况下,我需要一个要求parsing出页面标题AND和jQuery的所有其他善良,减去它发射脚本。 这是我的解决scheme,似乎工作。
$.get('/somepage.htm', function (data) { // excluded code to extract title for simplicity var bodySI = data.indexOf('<body>') + '<body>'.length, bodyEI = data.indexOf('</body>'), body = data.substr(bodySI, bodyEI - bodySI), $body; body = body.replace(/<script[^>]*>/gi, ' <!-- '); body = body.replace(/<\/script>/gi, ' --> '); //console.log(body); $body = $('<div>').html(body); console.log($body.html()); });
这种快捷方式担心脚本,因为您不是试图删除脚本标记和内容,而是用替代它们的评论渲染scheme来破坏它们,因为您将会有评论分隔您的脚本声明。
让我知道如果这仍然存在一个问题,因为它也会帮助我。
这里有各种各样的shell脚本可以用来去除不同的元素。
# doctype find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/<\!DOCTYPE\s\+html[^>]*>/<\!DOCTYPE html>/gi" {} \; # meta charset find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/<meta[^>]*content=[\"'][^\"']*utf-8[\"'][^>]*>/<meta charset=\"utf-8\">/gi" {} \; # script text/javascript find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<script[^>]*\)\(\stype=[\"']text\/javascript[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \; # style text/css find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<style[^>]*\)\(\stype=[\"']text\/css[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \; # html xmlns find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<html[^>]*\)\(\sxmlns=[\"'][^\"']*[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \; # html xml:lang find . -regex ".*\.\(html\|py\)$" -type f -exec sed -i "s/\(<html[^>]*\)\(\sxml:lang=[\"'][^\"']*[\"']\)\(\s\?[^>]*>\)/\1\3/gi" {} \;
/(?:(?!</ s \ w)<[^ <] ) </ s \ w * / gi; – 删除任何组合中的任何序列
如果你想从一些HTML文本中删除所有的JavaScript代码,那么删除<script>
标签是不够的,因为JavaScript仍然可以处于“onclick”,“onerror”,“href”等属性。
试试这个处理所有这些的npm模块: https : //www.npmjs.com/package/strip-js
你可以试试
$("your_div_id").remove();
要么
$("your_div_id").html("");
尝试这个:
var text = text.replace(/<script[^>]*>(?:(?!<\/script>)[^])*<\/script>/g, "")