解码包含特殊 HTML 实体的字符串的正确方法是什么?

2022-08-30 00:25:01

假设我从服务请求中取回了一些 JSON,如下所示:

{
    "message": "We're unable to complete your request at this time."
}

我不确定为什么那个启示录是这样编码的();我只知道我想解码它。'

以下是使用jQuery的一种方法,它突然出现在我的脑海中:

function decodeHtml(html) {
    return $('<div>').html(html).text();
}

不过,这似乎(非常)笨拙。什么是更好的方法?有没有“正确”的方式?


答案 1

这是我最喜欢的解码HTML字符的方法。使用此代码的优点是还可以保留标记。

function decodeHtml(html) {
    var txt = document.createElement("textarea");
    txt.innerHTML = html;
    return txt.value;
}

示例:http://jsfiddle.net/k65s3/

输入:

Entity:&nbsp;Bad attempt at XSS:<script>alert('new\nline?')</script><br>

输出:

Entity: Bad attempt at XSS:<script>alert('new\nline?')</script><br>

答案 2

不要使用 DOM 来执行此操作。使用 DOM 解码 HTML 实体(如当前接受的答案中所建议的那样)会导致跨浏览器结果的差异

对于根据HTML标准中的算法解码字符引用的健壮和确定性解决方案,请使用he。从其自述文件:

(用于“HTML实体”)是用JavaScript编写的强大的HTML实体编码器/解码器。它支持所有标准化的命名字符引用像浏览器一样处理模糊的&符号和其他边缘情况,具有广泛的测试套件,并且与许多其他JavaScript解决方案相反,处理星体Unicode符号就好了。提供在线演示。

以下是它的使用方法:

he.decode("We&#39;re unable to complete your request at this time.");
→ "We're unable to complete your request at this time."

免责声明:我是he图书馆的作者。

有关详细信息,请参阅此堆栈溢出答案