在 JavaScript 中,将 HTML 代码转换为 HTML 实体编码(如将<
转为<
)有多种方法。以下是几种常见实现及其对比:
方法一:使用 DOM API(推荐)
通过创建临时元素并设置textContent
,利用浏览器自动编码的特性:javascript
function escapeHtmlUsingDom(html) {
const div = document.createElement('div');
div.textContent = html;
return div.innerHTML;
}
// 示例
console.log(escapeHtmlUsingDom('<33></44>'));
// 输出: <33></44>
方法二:正则表达式替换(高性能)
手动替换主要的 HTML 特殊字符:javascript
function escapeHtmlUsingRegex(html) {
return html
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
// 示例
console.log(escapeHtmlUsingRegex('<33></44>'));
// 输出: <33></44>
方法三:String.prototype.replace + 对象映射
使用对象映射更简洁地处理多个字符:javascript
function escapeHtmlUsingMap(html) {
const entityMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return html.replace(/[&<>"']/g, char => entityMap[char]);
}
// 示例
console.log(escapeHtmlUsingMap('<33></44>'));
// 输出: <33></44>
方法四: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);
// 输出: <script>alert("XSS")</script><33></44>
// 显示在页面中(安全渲染)
document.getElementById('output').textContent = escapedText;
注意事项
- 特殊字符范围:基本的 HTML 转义通常处理
&
,<
,>
,"
,'
。 - 性能考虑:正则表达式方法在大量数据处理时性能最优。
- 安全净化:如果需要防止 XSS 攻击,推荐结合 DOMPurify 使用。
根据您的具体需求选择合适的方法即可。