如何在不使用 Javascript 对标签本身进行编码的情况下对可能具有 html 标签的文本进行 HTML 编码

Posted

技术标签:

【中文标题】如何在不使用 Javascript 对标签本身进行编码的情况下对可能具有 html 标签的文本进行 HTML 编码【英文标题】:How can I HTML encode text that may have html tags without encoding the tags themselves in Javascript 【发布时间】:2012-02-25 12:50:10 【问题描述】:

基本上我有一些可能包含 html 标记但也可能包含非 HTML 编码字符的文本。

var doc = window.document.implementation.createDocument
    ('http://www.w3.org/1999/xhtml', 'html',  null);
var text = '<head><script>somejs</script>' +
      '<script>var x = 7; var y = 5; var foo = x < y;</script>' +
      '</head><body></body>');

我希望将文本设置为元素的 innerHTML 属性。如果我只是这样做

doc.getElementsByTagName('html')[0].innerHTML = text;

这会导致 INVALID_STATE_ERR: DOM Exception 11,因为 x 和 y 之间有小于号。

但是,如果我 htmlEncode 我得到的可变文本

&lt;head&gt;&lt;script&gt;somejs&lt;/script&gt;&lt;script&gt;var x = 7; var y = 5; var     foo = x &lt; y;&lt;/script&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;

因此,一旦设置了它的 innerHTML,我就丢失了该元素所需的所有标签。是否有任何标准方法可以对字符串中所有标签的内容进行 htmlencode 而无需对标签本身进行编码?

【问题讨论】:

使用escapeunescape 得到你的结果。 不幸的是,它转义了整个字符串,因此如果我想执行类似 doc.getElementsByTagName('script') 之类的操作,我将一无所获,因为构成脚本标签的 已被转义。 【参考方案1】:

对于内联脚本you need to escape the string &lt;/script when followed by a space character, &gt;, or /, else it would close the respective opening tag。

因此,您可以使用&lt;\/script&gt;,而不是&lt;/script&gt;。这有效:

var text = '<head><script>somejs<\/script><script>var x = 7; var y = 5; var foo = x < y;<\/script></head><body></body>';
el.innerHTML = text;

更新:现在您已经编辑了您的问题,我看到您正在使用 XHTML!这就解释了——innerHTML 在 XHTML 中不起作用。

【讨论】:

我编辑了我的问题以显示我的实际用例,抱歉我一开始并不清楚。对我来说,在上述情况下,即使我使用正斜杠,我仍然会得到 INVALID_STATE_ERR。但是,如果我将 'x @user959986 如果你想转义&lt; 字符,you can,但这不是必须的。 啊,我的错:/我有点菜鸟。我真的不在乎我使用哪个。我想要的只是以后能够调用 var scripts = doc.getElementsByTagName('script') 然后能够通过执行 scripts[0].innerHTML;有什么办法可以使这项工作?基本上我只想从变量文本中提取一对 标记之间的所有 javascript 代码。

以上是关于如何在不使用 Javascript 对标签本身进行编码的情况下对可能具有 html 标签的文本进行 HTML 编码的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用outerHTML的情况下在javascript中将标签作为文本? [复制]

如何在不禁用标签的情况下灰显标签?

如何在不创建 scm 标签的情况下进行 Maven 发布?

如何在不使用 JavaScript 或 jQuery 的情况下将 div 的文本绑定到隐藏字段?

如何使用 JavaScript 编码标签实体 [关闭]

html中如何显示<script>本身