使用 JS 正则表达式从 html 中删除所有脚本标签

IT技术 javascript html regex
2021-01-15 12:28:11

我想在 Pastebin 中从这个 HTML 中去除脚本标签:

http://pastebin.com/mdxygM0a

我尝试使用以下正则表达式:

html.replace(/<script.*>.*<\/script>/ims, " ")

但它不会删除 HTML 中的所有脚本标记。它只删除内嵌脚本。我正在寻找一些可以删除所有脚本标签(内联和多行)的正则表达式。如果对我的样本进行测试http://pastebin.com/mdxygM0a将不胜感激

6个回答

在某些情况下,jQuery 使用正则表达式来删除脚本标签,我很确定它的开发人员有充分的理由这样做。也许有些浏览器使用时插入其中执行脚本innerHTML

这是正则表达式:

/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi

在人们开始哭泣“但是 HTML 的正则表达式是邪恶的”之前:是的,它们是- 但是对于脚本标签,由于特殊行为,它们是安全的 - 一个<script>部分可能根本不包含</script>,除非它应该在这个位置结束。因此很容易将它与正则表达式匹配。但是,快速浏览一下,上面的正则表达式没有考虑结束标签内的尾随空格,因此您必须测试</script   等是否仍然有效。

如果您将文档中某个元素的 innerHTML 属性设置为包含具有 defer 属性的 script 元素的标记,它将在某些浏览器(例如 IE)中执行。但是,如果将相同的标记分配给不在文档中的元素,或者未设置 defer 属性,则不会执行脚本。使用正则表达式是有问题的,它在某些情况下会失败。Prototype.js 使用不同的 RegExp: /<script[^>]*>([\\S\\s]*?)<\/script>/img
2021-03-19 12:28:11
</script>不允许在脚本标签内。它总是结束它。
2021-03-23 12:28:11
2021-03-30 12:28:11
but for script tags they are safe 它在这里失败:stackoverflow.com/a/18052486/2570622 <script type="text/javascript"> var test1 = "</script>"; var test2 = '<script>'; </script>
2021-04-05 12:28:11
有没有人成功使用上述方法一段时间?
2021-04-11 12:28:11

尝试使用正则表达式删除 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 属性插入,浏览器将不会执行脚本,并且可能永远不会执行,特别是因为该元素未添加到文档中。

这在 IE8 中似乎不起作用 div.innerHTML = s; 什么都不做,如果我检查 div.innerHTML 的值它的“”
2021-03-22 12:28:11
非常感谢这一点。我将您的方法与 jQuery 及其完美结合使用。
2021-04-06 12:28:11
它适用于我测试过的所有浏览器,包括 IE 6。我有几天不能尝试 IE 8,但可以肯定的是我在那里测试过并且它可以工作。我会告诉你。
2021-04-07 12:28:11
谢谢!当心 jQuery.html(),它会执行脚本: $('<div>').html('<script>alert(1)</script>')
2021-04-10 12:28:11
@scader——如果要保留样式元素,则应将其添加为head 元素的innerHTML,而不是div,然后使用DOM 方法将其放入head 中。
2021-04-11 12:28:11

正则表达式是可以击败的,但是如果您不想将 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, "");
}
这很有效,但需要修改上面的每个neongrau 答案,以允许在关闭脚本标签中使用尾随空格 - 这仍然有效。
2021-03-25 12:28:11
你真棒 :)
2021-03-26 12:28:11

这个正则表达式也应该工作:

<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 注释的支持。

所以 HTML 的正则表达式毕竟是邪恶的!任何可以击败您的正则表达式的脚本?
2021-03-13 12:28:11
您的正则表达式很有趣,因为它能够忽略嵌套字符串。但我建议将开头替换为,<script(?:否则我会得到一个始终为空的捕获组。说到这里,您是否看到正则表达式捕获 js 内容的解决方案?不必单独删除标签会很有趣..
2021-03-21 12:28:11
我在 Notepad++ 中使用这个正则表达式来清除不需要的脚本标签的 HTML 代码,它一直很好地为我服务。
2021-03-28 12:28:11
我实际上在几种情况下使用邪恶的正则表达式来解析 HTML,并且它看起来运行良好。我刚刚编辑了这篇文章并通过支持 JavaScript 变量中的转义引号增强了正则表达式。(那会打败我的正则表达式 :-)
2021-03-29 12:28:11
实际上,经过测试,我发现了被您的正则表达式忽略的脚本(没有找到原因,示例本身有点长,并且在我删除评论部分时令人惊讶地破坏了正则表达式 - 可能是关于偶数或奇数'"-)。但更糟糕的是,这篇文章的一些评论是完全正确的:即使在一个字符串中,a</script>结束脚本,这是正常行为,所以你的正则表达式产生与 DOM 方法不同的结果......太糟糕了,我是狂热的:/
2021-04-01 12:28:11

每当您不得不求助于基于正则表达式的脚本标记清理时。至少以以下形式在结束标记中添加一个空格

</script\s*>

否则像

<script>alert(666)</script   >

将保留,因为标记名后的尾随空格有效。

投票,但请不要将这样的事情作为单独的答案发布。它必须是评论。
2021-03-28 12:28:11