用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, "")