将已清理的html转换回可显示的html

时间:2009-08-08 13:08:44

标签: javascript html

我从已经过消毒的数据库中获取html数据。

基本上我得到的是这样的:

<div class="someclass"><blockquote>
  <p>something here.</p>
</blockquote>

等等。因此,如果我尝试显示它,它将显示为

<div class="someclass"><blockquote> <p>something here</p> </blockquote>

我想要的是在显示之前将其转换为正确的html,以便在没有标签的情况下正确显示内容。

使用javascript最简单的方法是什么?

我想在此注意我正在使用Adobe AIR。所以我没有其他选择。

5 个答案:

答案 0 :(得分:33)

您可以创建一个元素,将编码的HTML分配给其innerHTML,并从插入时创建的文本节点中检索nodeValue。

function htmlDecode(input){
  var e = document.createElement('div');
  e.innerHTML = input;
  return e.childNodes[0].nodeValue;
}

htmlDecode('&lt;div class="someclass"&gt;&lt;blockquote&gt; &lt;p&gt;&quot; ' +
           'something&quot;&nbsp;here.&lt;/p&gt;Q&lt;/blockquote&gt;')

// returns :
// "<div class="someclass"><blockquote> <p>"something" here.</p>Q</blockquote>"

请注意,此方法适用于所有HTML Character Entities

答案 1 :(得分:7)

这可能会有所帮助:

String.prototype.deentitize = function() {
    var ret = this.replace(/&gt;/g, '>');
    ret = ret.replace(/&lt;/g, '<');
    ret = ret.replace(/&quot;/g, '"');
    ret = ret.replace(/&apos;/g, "'");
    ret = ret.replace(/&amp;/g, '&');
    return ret;
};

答案 2 :(得分:0)

来自CMS的示例虽然很好,但没有考虑到例如“脚本”内容将在div中解析,然后完全不返回的情况。

所以我对字符串原型编写了以下简单扩展

if (!String.prototype.unescapeHTML) {
    String.prototype.unescapeHTML = function() {
        return this.replace(/&[#\w]+;/g, function (s) {
            var entityMap = {
                "&amp;": "&",
                "&lt;": "<",
                "&gt;": ">",
                '&quot;': '"',
                '&#39;': "'",
                '&#x2F;': "/"
            };

            return entityMap[s];
        });
    };
}

这会将“脚本”保留在文本中,而不会删除

示例

I will make things bad &lt;b&gt;because evil&lt;/b&gt;

&lt;script language="JavaScript"&gt;console.log('EVIL CODE');&lt;/script&gt;

将使用CMS样式方式删除“脚本”部分,但使用字符串unescapeHTML会将其保留

答案 3 :(得分:0)

https://lodash.com/docs/4.17.10#unescape

_.unescape('fred, barney, &amp; pebbles');
// => 'fred, barney, & pebbles'

答案 4 :(得分:-3)

我不确定你为什么要用JavaScript来做这件事,除非它是服务器端的JS ......但无论如何,你可以只用它们的等价物替换&gt;&lt;使用字符串的替换功能。

但是,如果您在某些文本中使用过这两个文件,可能会导致问题,例如您编写HTML教程或其他内容。这就是为什么在这种情况下你可能想要将未经过处理的HTML存储在数据库中,因为转换它可能很难正确地完成。