我想通过javascript函数将文本显示为HTML。如何在JS中转义html特殊字符?是否有API?
我想通过javascript函数将文本显示为HTML。如何在JS中转义html特殊字符?是否有API?
Answers:
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
replace()
调用中的正则表达式是不必要的。普通的旧单字符字符串也可以。
function 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>'>
您可以使用jQuery的.text()
功能。
例如:
从有关该.text()
功能的jQuery文档中:
我们需要注意的是,此方法会转义必要时提供的字符串,以便将其正确呈现为HTML。为此,它调用DOM方法.createTextNode(),而不将字符串解释为HTML。
jQuery文档的先前版本是这样写的(重点增加了):
我们需要注意的是,此方法会转义必要时提供的字符串,以便将其正确呈现为HTML。为此,它调用DOM方法.createTextNode(),该方法将特殊字符替换为其HTML实体等效项(例如&lt; for <)。
const str = "foo<>'\"&";
$('<div>').text(str).html()
yieldsfoo<>'"&
我想我找到了正确的方法...
// 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
到目前为止,这是我所看到的最快的方法。另外,它无需添加,删除或更改页面上的元素即可完成所有操作。
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!
找到更好的解决方案很有趣:
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
您可以对字符串中的每个字符进行编码:
function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
或仅针对主要字符来担心(&,inebreaks,<,>,“和'),例如:
function encode(r){
return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
}
test.value=encode('How to encode\nonly html tags &<>\'" nice & fast!');
/*************
* \x26 is &ersand (it has to be first),
* \x0A is newline,
*************/
<textarea id=test rows="9" cols="55">www.WHAK.com</textarea>
一线(适用于ES6 +):
var escapeHtml = s => (s + '').replace(/[&<>"']/g, m => ({
'&': '&', '<': '<', '>': '>',
'"': '"', "'": '''
})[m]);
对于旧版本:
function escapeHtml(s) {
return (s + '').replace(/[&<>"']/g, function (m) {
return ({
'&': '&', '<': '<', '>': '>',
'"': '"', "'": '''
})[m];
});
}
在构建DOM结构时遇到了这个问题。这个问题帮助我解决了。我想使用双V形作为路径分隔符,但是附加一个新的文本节点直接导致显示转义的字符代码,而不是字符本身:
var _div = document.createElement('div');
var _separator = document.createTextNode('»');
//_div.appendChild(_separator); /* this resulted in '»' being displayed */
_div.innerHTML = _separator.textContent; /* this was key */
如果您已经在应用程序中使用模块,则可以使用escape-html模块。
import escapeHtml from 'escape-html';
const unsafeString = '<script>alert("XSS");</script>';
const safeString = escapeHtml(unsafeString);
我想出了这个解决方案。
假设我们要向元素添加一些HTML,其中包含来自用户或数据库的不安全数据。
var unsafe = 'some unsafe data like <script>alert("oops");</script> here';
var html = '';
html += '<div>';
html += '<p>' + unsafe + '</p>';
html += '</div>';
element.html(html);
这对于XSS攻击是不安全的。现在添加它。
$(document.createElement('div')).html(unsafe).text();
就是这样
var unsafe = 'some unsafe data like <script>alert("oops");</script> here';
var html = '';
html += '<div>';
html += '<p>' + $(document.createElement('div')).html(unsafe).text(); + '</p>';
html += '</div>';
element.html(html);
对我来说,这比使用起来容易得多.replace()
,它将删除!!!所有可能的html标签(我希望)。
<script>
为<script>
。