我想通过JavaScript函数将文本显示到HTML上。在JavaScript中如何转义HTML特殊字符?是否有相应的API可以使用?
我想通过JavaScript函数将文本显示到HTML上。在JavaScript中如何转义HTML特殊字符?是否有相应的API可以使用?
以下是一种几乎适用于所有Web浏览器的解决方案:
function escapeHtml(unsafe)
{
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
如果您仅支持现代网络浏览器(2020+),则可以使用新的replaceAll函数:
const escapeHtml = (unsafe) => {
return unsafe.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", ''');
}
replace()
函数中使用正则表达式是不必要的。普通的单个字符字符串同样可以胜任。 - jamixfunction escapeHtml(html){
var text = document.createTextNode(html);
var p = document.createElement('p');
p.appendChild(text);
return p.innerHTML;
}
// Escape while typing & print result
document.querySelector('input').addEventListener('input', e => {
console.clear();
console.log( escapeHtml(e.target.value) );
});
<input style='width:90%; padding:6px;' placeholder='<b>cool</b>'>
"
或'
),因此如果在HTML标记属性中使用该函数生成的字符串,仍然可能会造成损害。 - jdgregson_.escape(192.168.1.1)
时,似乎无法用于IP地址,但如果我添加引号,那么它就可以工作:_.escape('52.60.62.147')
,即使我引用的变量的值不是字符串。LoDash太棒了! - Kreidol.text()
函数。const str = "foo<>'\"&";
使用 $('<div>').text(str).html()
将得到 foo<>'"&
。 - amoebe'
和 "
未转义,这可能会让您感到困惑。 - Ben Philipp到目前为止,这是我看过的最快的方法。此外,它在不添加、删除或更改页面元素的情况下完成了所有操作。
function escapeHTML(unsafeText) {
let div = document.createElement('div');
div.innerText = unsafeText;
return div.innerHTML;
}
var divCode = '<div data-title="' + escapeHTML('Jerry "Bull" Winston') + '">Div content</div>'
将生成无效的HTML! - izogfif我认为我找到了正确的方法来做这件事...
// Create a DOM Text node:
var text_node = document.createTextNode(unescaped_text);
// Get the HTML element where you want to insert the text into:
var elem = document.getElementById('msg_span');
// Optional: clear its old contents
//elem.innerHTML = '';
// Append the text node into it:
elem.appendChild(text_node);
document.createTextNode("<script>alert('Attack!')</script>").textContent
,则文本节点的内容不会被转义。请斟酌使用。 - maechler找到一个更好的解决方案很有趣:
var escapeHTML = function(unsafe) {
return unsafe.replace(/[&<"']/g, function(m) {
switch (m) {
case '&':
return '&';
case '<':
return '<';
case '"':
return '"';
default:
return ''';
}
});
};
我不解析>
,因为它不会破坏结果中的XML / HTML代码。
以下是基准测试:http://jsperf.com/regexpairs
此外,我创建了一个通用的escape
函数:http://jsperf.com/regexpairs2
显示未编码文本的最简洁和高效方法是使用textContent
属性。
比使用innerHTML
更快。而且这还没有考虑转义开销。
document.body.textContent = 'a <b> c </b>';
</
。 - user&#xHH;
(如果有命名实体可用,则使用命名实体),以防止切换到属性之外。”function escapeHTML(unsafe) {
return unsafe.replace(
/[\u0000-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u00FF]/g,
c => '&#' + ('000' + c.charCodeAt(0)).slice(-4) + ';'
)
}
document.querySelector('div').innerHTML =
'<span class=' +
escapeHTML('"fakeclass" onclick="alert("test")') +
'>' +
escapeHTML('<script>alert("inspect the attributes")\u003C/script>') +
'</span>'
<div></div>
<tags>
之间的HTML内容时,请使用"HTML实体编码":DOM元素支持通过将文本分配给 innerText 将文本转换为HTML。 innerText不是一个函数,但是像分配文本被转义一样工作。
document.querySelectorAll('#id')[0].innerText = 'unsafe " String >><>';
<br>
元素,这可能会破坏某些元素,如样式或脚本。 createTextNode
不容易出现这个问题。 - ZzZomboinnerText
存在一些遗留/规范问题。最好使用textContent
。 - Roy Tinker