JavaScript 实现 HTMLDecode

背景

最近公司有个格式整理的需求,需要将转义序列 \你\好 转换为中文。

&# 是什么?

HTMLXMLSGML 类语言的转义序列(escape sequence)。它们不是「编码」。

&#x4e2d;&#x56fd;<!--中国-->
&#20013;&#22269;<!--中国-->

这种转义序列叫 numeric character reference(NCR)

可以理解为 &# 拼接 Unicode code point,以「&#」开头的后接十进制数字,以「&#x」开头的后接十六进制数字。

例如 「中国」二字分别是 Unicode 字符 U+4E2D 和 U+56FD,十六进制表示的 code point 数值「4E2D」和「56FD」就是十进制的「20013」和「22269」,所以上面两种 NCR 写法都会在显示时转换为「中国」二字。

实现

1. 通过浏览器

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

2. he 库

通过浏览器 HTMLDecode 在不同浏览器表现可能有差异。

可以使用这个符合 HTML 规范的库 he
HTMLEncode/HTMLDecode

3. 根据转义规则简单实现替换中文

我们公司只需要替换中文部分,所以我使用下面函数就能实现。

function decodeHtml(str) {
    return str.replace(/&#([xX][0-9a-fA-F]+);/g, function (match, dec) {
        return String.fromCharCode('0' + dec);
    }).replace(/&#(\d+);/g, function (match, dec) {
        return String.fromCharCode(dec);
    });
}

资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值