一行代码实现 unescape html

发布于 2021-11-22 12:45:05 字数 2999 浏览 1187 评论 0

实体符

在 HTML 中,某些字符是预留的。在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。如需显示小于号,我们必须这样写:<< 或者 <;

不同的表现格式是根据原始字符的 ascii 码来进行关联的。其中,< 符号对应的十进制 ascii 为 60,对应的十六进制为 3c。

因此,对实体符的解码,需要匹配符合格式的 &# 来进行解码。

解码

根据格式得出正则:

/&#(x)?([\w\d]{0,5});/ig

然后进行字符串替换

/**
 * 解码 html 实体符
 * @param str {String} html 实体符
 * @returns {String}
 */
var unescapeHTML = function (str) {
    return str.replace(/&#(x)?([\w\d]{0,5});/ig, function (full, hex, code) {
        return String.fromCharCode(parseInt(code, hex ? 16 : 10));
    });
};

此时,一些如 < 这样的字符是无法正常替换的,需要建立一个 map 表来进行处理。


/**
 * 解码 html 实体符 map
 * @type {Object}
 */
var unescapeHTMLMap = {
    '&': /&/g,
    '<': /</g,
    '>': />/g,
    '"': /"/g,
    '\'': /'/g,
    '/': ///g
};
/**
 * 解码 html 实体符
 * @param str {String} html 实体符
 * @returns {String}
 */
var unescapeHTML = function (str) {
    str = str.replace(/&#(x)?([\w\d]{0,5});/ig, function (full, hex, code) {
        return String.fromCharCode(parseInt(code, hex ? 16 : 10));
    });

    for (var src in unescapeHTMLMap) {
        str = str.replace(unescapeHTMLMap[src], src);
    }

    return str;
};

至此,一个完整的解码 html 实体符的功能就完成了。

真一行

利用 innerHTML 和 textContent 来实现。

/**
 * 解码 html 实体符
 * @param str {String} html 实体符
 * @returns {String}
 */
var unescapeHTML = (function (str) {
    var $p = document.createElement('p');

    $p.style.display = 'none';
	document.body.appendChild($p);

    return function (str) {
        $p.innerHTML = str;

        return $p.textContent || $p.innerText;
    };
}());

如果原始字符串有 html 标签,则会被过滤。如:

unescapeHTML('<<<<')
// => "<<<<"
unescapeHTML('<<<<<a></a>')
// => "<<<<"

原始的 <a> 标签被过滤掉了。

既然 html 标签会被过滤,那么我们可以在开始的时候进行一次 escape 转换即可:

/**
 * 解码 html 实体符
 * @param str {String} html 实体符
 * @returns {String}
 */
var unescapeHTML = (function (str) {
    var p = document.createElement('p');

    return function (str) {
        // 处理掉 < 符号,防止 html 标签(如:<a>)被过滤
        p.innerHTML = (str + '').replace(/</g, '<');

        return p.textContent || p.innerText || '';
    };
}());

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
908 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文