首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JS正则表达式从html中删除所有脚本标记

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

Stack Overflow用户
提问于 2011-07-12 12:01:50
回答 13查看 148.5K关注 0票数 70

我想在Pastebin中从这个HTML中剥离脚本标记:

http://pastebin.com/mdxygM0a

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

代码语言:javascript
复制
html.replace(/<script.*>.*<\/script>/ims, " ")

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

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2011-07-12 14:09:56

尝试使用正则表达式删除HTML标记是有问题的。你不知道里面的脚本或属性值是什么。一种方法是将其作为div的innerHTML插入,删除所有脚本元素并返回innerHTML,例如

代码语言:javascript
复制
  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属性插入脚本,浏览器将不会执行该脚本,并且很可能永远不会执行,尤其是因为该元素没有添加到文档中。

票数 102
EN

Stack Overflow用户

发布于 2011-07-12 14:29:52

在某些情况下,jQuery使用正则表达式来删除脚本标记,我敢肯定它的开发人员有一个非常好的理由这样做。可能某些浏览器在使用innerHTML插入脚本时确实会执行脚本。

下面是正则表达式:

代码语言:javascript
复制
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi

在人们开始叫喊“但是HTML的正则表达式是邪恶的”之前:Yes, they are -但是对于脚本标记,它们是安全的,因为它的特殊行为- <script>部分可能根本不包含</script>,除非它应该在这个位置结束。因此,将其与正则表达式相匹配是很容易的。但是,从快速查看上面的正则表达式没有考虑到结束标记中的尾随空格,所以您必须测试</script、、等是否仍然有效。

票数 122
EN

Stack Overflow用户

发布于 2012-03-28 08:07:45

正则表达式是可以击败的,但是如果您有一个不想注入到DOM中的字符串版本的HTML,那么它们可能是最好的方法。你可能想把它放在一个循环中来处理类似这样的事情:

代码语言:javascript
复制
<scr<script>Ha!</script>ipt> alert(document.cookie);</script>

下面是我使用上面的jquery regex所做的工作:

代码语言:javascript
复制
var SCRIPT_REGEX = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
while (SCRIPT_REGEX.test(text)) {
    text = text.replace(SCRIPT_REGEX, "");
}
票数 48
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6659351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档