如何禁用html文本中的脚本标记

how to disable script tags in a html text?

本文关键字:脚本 何禁用 html 文本      更新时间:2023-09-26

我有一个带有id=contentdiv,我想将它的innerHtml更改为字符串变量markup,但我想禁用脚本标记。

例如,如果

markup='<b>Bold text here </b><i><script>alert("JS will be treated as normal text")</script></i>';

contentdiv应为

此处为粗体文本<script>alert("JS将被视为普通文本")<脚本>

我不能使用innerHTML,因为它将运行警报框;我不能使用innerText,因为其他标记将显示为普通文本。

我搜索了这个问题,发现了很多regix表达式。我对regix了解不多,但我发现的所有表达式都是删除所有标签,而不是禁用标签。

我不想使用jquery,尽管我尝试使用.vla().text(),但都没有成功。但现在我只想使用js。

我还希望它能够处理脚本标记的任何有效变体,包括:<Script>, <sCrIPt><script type= "text/javascript"></script >

您可以使用replace()函数用转义版本简单地替换脚本标记。但是,如果需要替换多个实例,则需要设置全局标志的regex。因此,要替换脚本的打开和关闭标记,它将是这样的:

var html = markup.replace(/<script[^>]*>/gi, "&lt;script&rt;").replace(/<'/script[^>]*>/gi, "&lt;/script&rt;");

为了替换结束标记,'/必须转义正斜杠,这样浏览器就不会认为它正在关闭regex模式。"i"标志使其不区分大小写,因此使用大写和小写的组合并不重要。并且[^>]*意味着它将匹配不是>的任何数量的字符(包括0)。因此,它将替换<script和结束>之间的任何字符。

只需用类似&lt;script&rt;的东西替换<script>的任何实例,这样它就不会呈现为标记,而是以HTML形式输出,看起来就像是一个标记。

考虑以下内容:

markup.replace(/<script>/gi, "&lt;script&rt;");

你也可以对结束标签做同样的事情:

// Replaces start and end tag
markup.replace(/<script>/gi, "&lt;script&rt;").replace(/</script>/gi, "&lt;/script&rt;");

更新

通过添加gi,它使整个表达式不区分大小写。

只需调用一次replace 即可替换所有脚本标记

markup.replace(/<('/?script)>/gi, '&lt;$1&gt;');

gi标志使正则表达式不区分大小写(i)和全局(g),因此它可以替换模式的多个实例。

?使前一个字符可选,在这种情况下,它可以匹配"<script>""</script>"