jquery 解码一个包含特殊HTML实体的字符串的正确方法是什么?[duplicate]

fafcakar  于 2022-11-03  发布在  jQuery
关注(0)|答案(7)|浏览(118)

此问题在此处已有答案

Unescape HTML entities in JavaScript?(31个答案)
五年前就关门了。
假设我从一个服务请求中得到一些JSON,如下所示:

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

我不确定 * 为什么 * 那个撇号是这样编码的(');我只知道我想破解它。
我想到了一种使用jQuery的方法:

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

不过,这看起来(很)老套。有什么更好的方法吗?有“正确”的方法吗?

a5g8bdjr

a5g8bdjr1#

这是我最喜欢的解码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>
tpgth1q7

tpgth1q72#

**如果您关心旧版兼容性,请不要使用DOM。**使用DOM解码HTML实体(如当前接受的答案所建议的)会导致在非现代浏览器上跨浏览器结果的差异。

要获得根据HTML标准中的算法对字符引用进行解码的可靠且确定性的解决方案,请使用the he library

  • he*(代表“HTML实体”)是一个用JavaScript编写的健壮的HTML实体编码器/解码器。它支持所有标准化的命名字符引用,就像浏览器一样处理ambiguous ampersands和其他边缘情况,有一个广泛的测试套件,并且--与许多其他JavaScript解决方案相反-- he 可以很好地处理星体Unicode符号。An online demo is available.

以下是您的使用方法:

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

免责声明:我是 he 库的作者。
有关更多信息,请参见this Stack Overflow answer

jc3wubiy

jc3wubiy3#

如果您不想使用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]

修复了函数(一些排印错误),在此处测试:http://jsfiddle.net/Be2Bd/1/

jdgnovmf

jdgnovmf4#

有JS函数处理 &#xxxx 样式的实体:
function at GitHub
第一个

cwtwac6a

cwtwac6a5#

jQuery将为您进行编码和解码。
第一个

vptzau2j

vptzau2j6#

_.unescape能满足您的需求
https://lodash.com/docs/#unescape

6tr1vspr

6tr1vspr7#

这是一个很好的答案。你可以用这个来表示角形,就像这样:

moduleDefinitions.filter('sanitize', ['$sce', function($sce) {
    return function(htmlCode) {
        var txt = document.createElement("textarea");
        txt.innerHTML = htmlCode;
        return $sce.trustAsHtml(txt.value);
    }
}]);

相关问题