在JavaScript中,将包含HTML实体字符的字符串转换为普通字符有几种方法:
1. 使用 DOMParser(推荐)
javascript
function decodeHTMLEntities(text) {
const textArea = document.createElement('textarea');
textArea.innerHTML = text;
return textArea.value;
}
// 或者使用 DOMParser
function decodeHTMLEntities(text) {
const doc = new DOMParser().parseFromString(text, 'text/html');
return doc.documentElement.textContent;
}
// 示例
const encodedString = "Hello & Welcome <world>";
const decodedString = decodeHTMLEntities(encodedString);
console.log(decodedString); // "Hello & Welcome <world>"
2. 使用 textarea 元素
javascript
function decodeHTMLEntities(text) {
const textarea = document.createElement('textarea');
textarea.innerHTML = text;
return textarea.value;
}
// 示例
const result = decodeHTMLEntities("John & Jane © 2023");
console.log(result); // "John & Jane © 2023"
3. 使用正则表达式替换(适用于常见实体)
javascript
function decodeHTMLEntities(text) {
const entities = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
''': "'",
' ': ' ',
'©': '©',
'®': '®'
};
return text.replace(/&[a-z]+;/g, match => {
return entities[match] || match;
});
}
// 示例
const result = decodeHTMLEntities("Price < $100 & free shipping");
console.log(result); // "Price < $100 & free shipping"
4. 处理数字实体
javascript
function decodeHTMLEntities(text) {
return text.replace(/&#(\d+);/g, (match, dec) => {
return String.fromCharCode(dec);
}).replace(/&#x([0-9a-f]+);/gi, (match, hex) => {
return String.fromCharCode(parseInt(hex, 16));
});
}
// 示例
const result = decodeHTMLEntities("AA BB");
console.log(result); // "AA BB"
5. 完整的解决方案
javascript
function decodeHTMLEntities(text) {
// 创建临时元素
const textArea = document.createElement('textarea');
textArea.innerHTML = text;
// 处理数字实体(如果需要)
let decoded = textArea.value;
decoded = decoded.replace(/&#(\d+);/g, (match, dec) => {
return String.fromCharCode(dec);
});
return decoded;
}
// 或者使用更简单的方法
function decodeHTMLEntities(text) {
const element = document.createElement('div');
element.innerHTML = text;
return element.textContent || element.innerText || '';
}
使用示例
javascript
// 测试各种HTML实体
const testCases = [
"Hello & World",
"Price < $100 > $50",
""Quote" and 'apos'",
"Copyright © 2023",
"Spaces here",
"AA BB CC"
];
testCases.forEach(test => {
console.log(`原始: ${test}`);
console.log(`解码: ${decodeHTMLEntities(test)}`);
console.log('---');
});
注意事项
- 安全性:如果处理用户输入,请确保在适当的上下文中使用解码后的内容,避免XSS攻击
- 性能:对于大量文本,DOMParser方法通常性能较好
- 兼容性:DOMParser在现代浏览器中支持良好,如果需要支持旧浏览器,可以考虑textArea方法
推荐使用第一种或第二种方法,因为它们能够处理大多数HTML实体,包括命名字符引用和数字字符引用。