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

Javascript 什么';解码包含特殊HTML实体的字符串的正确方法是什么?,javascript,jquery,html-entities,Javascript,Jquery,Html Entities,假设我从服务请求中获得一些JSON,如下所示: { "message": "We're unable to complete your request at this time." } moduleDefinitions.filter('sanitize', ['$sce', function($sce) { return function(htmlCode) { var txt = document.createElement("textar

假设我从服务请求中获得一些JSON,如下所示:

{
    "message": "We're unable to complete your request at this time."
}
 moduleDefinitions.filter('sanitize', ['$sce', function($sce) {
    return function(htmlCode) {
        var txt = document.createElement("textarea");
        txt.innerHTML = htmlCode;
        return $sce.trustAsHtml(txt.value);
    }
}]);
我不知道为什么那个字母是这样编码的(
';
);我只知道我想解码它

这里有一种使用jQuery的方法突然出现在我的脑海中:

function decodeHtml(html) {
    return $('<div>').html(html).text();
}
函数解码html(html){
返回$('').html(html.text();
}

不过,这似乎(非常)令人讨厌。有什么更好的办法?有“正确”的方法吗?

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

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

输入:

Entity:&nbsp;Bad attempt at XSS:<script>alert('new\nline?')</script><br>
Entity:XSS:alert的错误尝试('new\nline?')
输出:

Entity: Bad attempt at XSS:<script>alert('new\nline?')</script><br>
Entity:XSS:alert的错误尝试('new\nline?')

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

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

输入:

Entity:&nbsp;Bad attempt at XSS:<script>alert('new\nline?')</script><br>
Entity:XSS:alert的错误尝试('new\nline?')
输出:

Entity: Bad attempt at XSS:<script>alert('new\nline?')</script><br>
Entity:XSS:alert的错误尝试('new\nline?')

如果不想使用html/dom,可以使用regex。我还没有测试过这个;但大致如下:

function parseHtmlEntities(str) {
    return str.replace(/&#([0-9]{1,3});/gi, function(match, numStr) {
        var num = parseInt(numStr, 10); // read num as normal number
        return String.fromCharCode(num);
    });
}
[编辑] 注意:这只适用于数字html实体,而不适用于&oring;之类的东西

[编辑2]
修复了函数(一些输入错误),在此处测试:

如果不想使用html/dom,可以使用正则表达式。我还没有测试过这个;但大致如下:

function parseHtmlEntities(str) {
    return str.replace(/&#([0-9]{1,3});/gi, function(match, numStr) {
        var num = parseInt(numStr, 10); // read num as normal number
        return String.fromCharCode(num);
    });
}
[编辑] 注意:这只适用于数字html实体,而不适用于&oring;之类的东西

[编辑2]
修复了函数(一些拼写错误),在这里测试:

有JS函数要处理&#xxxx样式的实体:


有JS函数处理&#xxxx样式的实体:


不要使用DOM来执行此操作。使用DOM来解码HTML实体(如当前接受的答案中所建议的)会导致错误

对于根据HTML标准中的算法解码字符引用的健壮且确定的解决方案,请使用。自述:

他(代表“HTML实体”)是一个用JavaScript编写的健壮的HTML实体编码器/解码器。它支持、处理和其他边缘情况,具有广泛的测试套件,并且-与许多其他JavaScript解决方案相反-他可以很好地处理astral 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图书馆的作者


有关更多信息,请参阅。

不要使用DOM来执行此操作。使用DOM解码HTML实体(如当前接受的答案中所建议的)会导致错误

对于根据HTML标准中的算法解码字符引用的健壮且确定的解决方案,请使用。自述:

他(代表“HTML实体”)是一个用JavaScript编写的健壮的HTML实体编码器/解码器。它支持、处理和其他边缘情况,具有广泛的测试套件,并且-与许多其他JavaScript解决方案相反-他可以很好地处理astral 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图书馆的作者


有关更多信息,请参阅。

jQuery将为您编码和解码

函数htmlDecode(值){
返回$(“”).html(值).text();
}
函数htmlEncode(值){
返回$('').text(value.html();
}

$(文档).ready(函数(){
$(“#编码”)
.文本(htmlEncode(“”);
$(“#已解码”)
.text(htmlDecode(“img src onerror='alert(0)');
});
htmlEncode()结果:

HtmlCode()结果:

jQuery将为您编码和解码

函数htmlDecode(值){
返回$(“”).html(值).text();
}
函数htmlEncode(值){
返回$('').text(value.html();
}

$(文档).ready(函数(){
$(“#编码”)
.文本(htmlEncode(“”);
$(“#已解码”)
.text(htmlDecode(“img src onerror='alert(0)');
});
htmlEncode()结果:

HtmlCode()结果:

这是一个非常好的答案。您可以将其用于以下角度:

{
    "message": "We&#39;re unable to complete your request at this time."
}
 moduleDefinitions.filter('sanitize', ['$sce', function($sce) {
    return function(htmlCode) {
        var txt = document.createElement("textarea");
        txt.innerHTML = htmlCode;
        return $sce.trustAsHtml(txt.value);
    }
}]);

这是一个很好的答案。您可以将其用于以下角度:

{
    "message": "We&#39;re unable to complete your request at this time."
}
 moduleDefinitions.filter('sanitize', ['$sce', function($sce) {
    return function(htmlCode) {
        var txt = document.createElement("textarea");
        txt.innerHTML = htmlCode;
        return $sce.trustAsHtml(txt.value);
    }
}]);

\uu.unescape
实现您所需的功能


\uu.unescape
满足您的需求


Ah,看起来基本上与我采用的方法相同,但没有jQuery依赖项(这很好)。不过,它看起来还是很粗糙吧?或者我应该完全适应它吗?哦,等等,我明白了:你正在使用
textarea
,特别是为了保留标记(如你所说),但HTML实体仍然被解码。相当聪明…这是可以接受的。这是解码HTML的最好方法。不传递任何标记,这与原始解决方案不同,原始解决方案解析(从而隐藏)标记。这是一个很好的技巧!我已经使用了一段时间的非
textarea
版本,这个版本要好得多。@Leonardo它从未附加到文档中。啊,看起来基本上和我采用的方法一样,但没有jQuery依赖项(这很好)。不过,它看起来还是很粗糙吧?或者我应该完全适应它吗?哦,等等,我明白了:你正在使用
textarea
,特别是为了保留标记(如你所说),但HTML实体仍然被解码。相当聪明…这是可以接受的。这是解码HTML的最好方法。不传递任何标记,这与原始解决方案不同,原始解决方案解析(从而隐藏)标记。这是一个很好的技巧!我已经用了一段时间了,这是一个非
textarea
版本,而且这个版本要好得多。@Leonardo它从未附加到文档中。可能的重复:可能的重复:关于
&和其他命名实体?这些仍然没有在这个实现中被解析。我已经评论过它们不会被解析的事实。要解析这些,您需要某种类型的hashmap(查找)。但是,如果该代码是自动生成的(比如说),那么它有可能总是返回数值。我只提供了一个纯js的方式