我从已经过消毒的数据库中获取html数据。
基本上我得到的是这样的:
<div class="someclass"><blockquote>
<p>something here.</p>
</blockquote>
等等。因此,如果我尝试显示它,它将显示为
<div class="someclass"><blockquote> <p>something here</p> </blockquote>
我想要的是在显示之前将其转换为正确的html,以便在没有标签的情况下正确显示内容。
使用javascript最简单的方法是什么?
我想在此注意我正在使用Adobe AIR。所以我没有其他选择。
答案 0 :(得分:33)
您可以创建一个元素,将编码的HTML分配给其innerHTML,并从插入时创建的文本节点中检索nodeValue。
function htmlDecode(input){
var e = document.createElement('div');
e.innerHTML = input;
return e.childNodes[0].nodeValue;
}
htmlDecode('<div class="someclass"><blockquote> <p>" ' +
'something" here.</p>Q</blockquote>')
// returns :
// "<div class="someclass"><blockquote> <p>"something" here.</p>Q</blockquote>"
请注意,此方法适用于所有HTML Character Entities。
答案 1 :(得分:7)
这可能会有所帮助:
String.prototype.deentitize = function() {
var ret = this.replace(/>/g, '>');
ret = ret.replace(/</g, '<');
ret = ret.replace(/"/g, '"');
ret = ret.replace(/'/g, "'");
ret = ret.replace(/&/g, '&');
return ret;
};
答案 2 :(得分:0)
来自CMS的示例虽然很好,但没有考虑到例如“脚本”内容将在div中解析,然后完全不返回的情况。
所以我对字符串原型编写了以下简单扩展
if (!String.prototype.unescapeHTML) {
String.prototype.unescapeHTML = function() {
return this.replace(/&[#\w]+;/g, function (s) {
var entityMap = {
"&": "&",
"<": "<",
">": ">",
'"': '"',
''': "'",
'/': "/"
};
return entityMap[s];
});
};
}
这会将“脚本”保留在文本中,而不会删除
示例
I will make things bad <b>because evil</b>
<script language="JavaScript">console.log('EVIL CODE');</script>
将使用CMS样式方式删除“脚本”部分,但使用字符串unescapeHTML会将其保留
答案 3 :(得分:0)
https://lodash.com/docs/4.17.10#unescape
_.unescape('fred, barney, & pebbles');
// => 'fred, barney, & pebbles'
答案 4 :(得分:-3)
我不确定你为什么要用JavaScript来做这件事,除非它是服务器端的JS ......但无论如何,你可以只用它们的等价物替换>
和<
使用字符串的替换功能。
但是,如果您在某些文本中使用过这两个文件,可能会导致问题,例如您编写HTML教程或其他内容。这就是为什么在这种情况下你可能想要将未经过处理的HTML存储在数据库中,因为转换它可能很难正确地完成。