如何使用JS正则表达式从html中删除所有脚本标记?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (61)

我试着用下面的正则表达式

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

但它不会删除html中的所有脚本标记。它只会删除内联脚本。请我需要一个正则表达式,可以删除所有脚本标记(内联和多行)。

提问于
用户回答回答于

尝试使用正则表达式去除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使用正则表达式去除脚本标签,我很确定它的开发者有一个很好的理由这样做。也许有些浏览器使用时插入其中执行脚本innerHTML

这是正则表达式:

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

对于脚本标记,由于特殊的行为,正则表达式是安全的 - 除非该部分应该在此位置结束,否则该<script>部分可能完全不包含</script>。因此,将它与正则表达式匹配很容易。但是,从上面的正则表达式可以看出,上面的正则表达式并没有考虑关闭标签内的尾随空白,因此必须测试是否</script 仍然有效。

扫码关注云+社区

领取腾讯云代金券