显然,这比我想象的更难找到。它甚至如此简单......
是否有与JavaScript 内置的PHP htmlspecialchars等效的函数?我知道自己实现它相当容易,但使用内置函数(如果可用)更好。
对于那些不熟悉 PHP 的人,htmlspecialchars 将类似的内容翻译<htmltag/>
成<htmltag/>
我知道这一点escape()
并且encodeURI()
不会这样工作。
显然,这比我想象的更难找到。它甚至如此简单......
是否有与JavaScript 内置的PHP htmlspecialchars等效的函数?我知道自己实现它相当容易,但使用内置函数(如果可用)更好。
对于那些不熟悉 PHP 的人,htmlspecialchars 将类似的内容翻译<htmltag/>
成<htmltag/>
我知道这一点escape()
并且encodeURI()
不会这样工作。
您的解决方案代码有问题——它只会转义每个特殊字符的第一次出现。例如:
escapeHtml('Kip\'s <b>evil</b> "test" code\'s here');
Actual: Kip's <b>evil</b> "test" code's here
Expected: Kip's <b>evil</b> "test" code's here
这是正常工作的代码:
function escapeHtml(text) {
return text
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
以下代码将产生与上述相同的结果,但性能更好,尤其是在大文本块上(感谢jbo5112)。
function escapeHtml(text) {
var map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return text.replace(/[&<>"']/g, function(m) { return map[m]; });
}
那就是 HTML 编码。没有原生的 javascript 函数可以做到这一点,但你可以谷歌搜索并得到一些做得很好的。
例如http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/
编辑:
这是我测试过的:
var div = document.createElement('div');
var text = document.createTextNode('<htmltag/>');
div.appendChild(text);
console.log(div.innerHTML);
输出: <htmltag/>
值得一读:http : //bigdingus.com/2007/12/29/html-escaping-in-javascript/
escapeHTML: (function() {
var MAP = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
var repl = function(c) { return MAP[c]; };
return function(s) {
return s.replace(/[&<>'"]/g, repl);
};
})()
注意:只运行一次。并且不要在已经编码的字符串上运行它,例如&
变成&amp;
这是一个转义 HTML 的函数:
function escapeHtml(str)
{
var map =
{
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return str.replace(/[&<>"']/g, function(m) {return map[m];});
}
并解码:
function decodeHtml(str)
{
var map =
{
'&': '&',
'<': '<',
'>': '>',
'"': '"',
''': "'"
};
return str.replace(/&|<|>|"|'/g, function(m) {return map[m];});
}
使用 jQuery,它可以是这样的:
var escapedValue = $('<div/>').text(value).html();
来自相关问题使用 jQuery 转义 HTML 字符串
正如评论中提到的,双引号和单引号在此实现中保持原样。这意味着如果您需要将元素属性设为原始 html 字符串,则不应使用此解决方案。