使用JS Regular Expression从html中删除所有脚本标记

Ken*_*edy 59 html javascript regex

我想在pastebin中从这个html中删除脚本标签

http://pastebin.com/mdxygM0a

我尝试使用下面的正则表达式

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   仍然有效.

  • 参考jQuery正则表达式:https://github.com/jquery/jquery/blob/1.7.2/src/ajax.js#L14 (5认同)
  • 如果将文档中元素的innerHTML属性设置为包含带有defer属性的script元素的标记,则它将在某些浏览器(例如IE)中执行.但是,如果将相同的标记分配给不在文档中的元素,或者未设置defer属性,则不会执行该脚本.使用正则表达式是有问题的,在某些情况下会失败.Prototype.js使用不同的RegExp:`/ <script [^>]*>([\\ S \\ s]*?)<\/script>/img`. (3认同)
  • 脚本标记内不允许使用“&lt;/script&gt;”。它总是会结束。 (2认同)

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属性插入,浏览器将不会执行脚本,并且可能永远不会特别是因为元素未添加到文档中.

  • 谢谢!小心jQuery.html(),是否执行脚本:$('<div>').html('<script> alert(1)</ script>') (4认同)

小智 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)

标记名有效后,因为尾随空格会保留.


Shi*_*yal 7

如果您想从某些 HTML 文本中删除所有 JavaScript 代码,那么删除<script>标签是不够的,因为 JavaScript 仍然可以存在于“onclick”、“onerror”、“href”和其他属性中。

试试这个处理所有这些的 npm 模块: https ://www.npmjs.com/package/strip-js