如何在不使用 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 我得到的可变文本
<head><script>somejs</script><script>var x = 7; var y = 5; var foo = x < y;</script></head><body></body>
因此,一旦设置了它的 innerHTML,我就丢失了该元素所需的所有标签。是否有任何标准方法可以对字符串中所有标签的内容进行 htmlencode 而无需对标签本身进行编码?
【问题讨论】:
使用escape
和unescape
得到你的结果。
不幸的是,它转义了整个字符串,因此如果我想执行类似 doc.getElementsByTagName('script') 之类的操作,我将一无所获,因为构成脚本标签的 已被转义。
【参考方案1】:
对于内联脚本you need to escape the string </script
when followed by a space character, >
, or /
, else it would close the respective opening tag。
因此,您可以使用<\/script>
,而不是</script>
。这有效:
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 如果你想转义<
字符,you can,但这不是必须的。
啊,我的错:/我有点菜鸟。我真的不在乎我使用哪个。我想要的只是以后能够调用 var scripts = doc.getElementsByTagName('script') 然后能够通过执行 scripts[0].innerHTML;有什么办法可以使这项工作?基本上我只想从变量文本中提取一对 标记之间的所有 javascript 代码。以上是关于如何在不使用 Javascript 对标签本身进行编码的情况下对可能具有 html 标签的文本进行 HTML 编码的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用outerHTML的情况下在javascript中将标签作为文本? [复制]