JS多种方法实现HTML代码转换为HTML实体编码(如将<转为<)

在 JavaScript 中,将 HTML 代码转换为 HTML 实体编码(如将<转为&lt;)有多种方法。以下是几种常见实现及其对比:

方法一:使用 DOM API(推荐)

通过创建临时元素并设置textContent,利用浏览器自动编码的特性:javascript

function escapeHtmlUsingDom(html) {
    const div = document.createElement('div');
    div.textContent = html;
    return div.innerHTML;
}

// 示例
console.log(escapeHtmlUsingDom('<33></44>')); 
// 输出: &lt;33&gt;&lt;/44&gt;

方法二:正则表达式替换(高性能)

手动替换主要的 HTML 特殊字符:javascript

function escapeHtmlUsingRegex(html) {
    return html
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#039;');
}

// 示例
console.log(escapeHtmlUsingRegex('<33></44>')); 
// 输出: &lt;33&gt;&lt;/44&gt;

方法三:String.prototype.replace + 对象映射

使用对象映射更简洁地处理多个字符:javascript

function escapeHtmlUsingMap(html) {
    const entityMap = {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        "'": '&#039;'
    };
    
    return html.replace(/[&<>"']/g, char => entityMap[char]);
}

// 示例
console.log(escapeHtmlUsingMap('<33></44>')); 
// 输出: &lt;33&gt;&lt;/44&gt;

方法四:DOMPurify(安全净化 HTML)

如果需要同时净化 HTML(防止 XSS 攻击),可以使用DOMPurify

// 需先引入DOMPurify库
const clean = DOMPurify.sanitize(html, { RETURN_DOM_FRAGMENT: true });
const escapedHtml = clean.textContent;

性能对比

方法速度(相对)安全性推荐场景
DOM API中等通用场景
正则表达式最快高(需覆盖所有特殊字符)高性能场景
对象映射代码简洁性优先
DOMPurify较慢最高需要净化 HTML 的场景

完整示例javascript

// 选择一种方法使用
const escapeHtml = escapeHtmlUsingDom; // 或其他方法

// 使用示例
const originalText = '<script>alert("XSS")</script><33></44>';
const escapedText = escapeHtml(originalText);

console.log(escapedText); 
// 输出: &lt;script&gt;alert("XSS")&lt;/script&gt;&lt;33&gt;&lt;/44&gt;

// 显示在页面中(安全渲染)
document.getElementById('output').textContent = escapedText;

注意事项

  1. 特殊字符范围:基本的 HTML 转义通常处理&<>"'
  2. 性能考虑:正则表达式方法在大量数据处理时性能最优。
  3. 安全净化:如果需要防止 XSS 攻击,推荐结合 DOMPurify 使用。

根据您的具体需求选择合适的方法即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注VB编程开发20年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值