2015-05-08 95 views
2

嗨我目前正在使用REST服务来拉入数据并使用angular来在前端打印数据。

我遇到的问题是,正在通过的字符串已经逃脱实体,如'而不是'(撇号)例如。 “受到法国&#最受欢迎的邻居的启发”。
decodeURI似乎根本不起作用。
我发现了一个解决方法,通过创建自定义过滤器来创建一个虚拟元素,将innerHTML设置为虚拟元素,然后在解析并返回该值之后将其放入innerHTML。从JSON解码为标准字符串

.filter("decoder", function() { 
    return function(item) { 
    var txt = item; 
    var dummy = document.createElement('p'); 
    dummy.innerHTML = txt; 
    txt = dummy.innerHTML; 
    dummy.remove(); 
    return txt; 
    } 
}) 

这感觉真的很脏,所以我想知道如果他们是一种避免DOM操作的方法。
谢谢!

+2

JSON *实际*看起来像什么?当你说“逃脱”时,你的意思是用HTML语法如“'”或其他什么来逃脱? – Pointy

+0

对不起,它看起来像解码它,当我把它。我现在正确更新 –

+4

如果可能,修复服务返回*实际*信息:<使用HTML/[字符编码](http:// en。 wikipedia.org/wiki/Character_encodings_in_HTML)在适当的上下文之外是错误的。 – user2864740

回答

0

您可以使用ng-bind-html代替使用过滤器来解码它。我认为这可以帮助你自动解码HTML字符串中的实体。

+0

我无法访问添加ngSanitize模块,不幸的是 –

+0

不,您不需要添加ngSanitize模块,只需简单的使用ng-bind-html –

3

您可以手动替换它们中的每一个。

.filter("decoder", function() { 
    return function (item) { 
    return item 
     .replace(/&#039;/g, "'") 
     .replace(/&quot;/g, '"') 
     .replace(/&amp;/g, "&") 
     .replace(/&lt;/g, "<") 
     .replace(/&gt;/g, ">"); 
    } 
}) 

我认为这个列表涵盖了所有这些,但是如果您看到其他东西,您可以随时添加它。它仍然有点混乱,但我认为它比向DOM添加元素好。

UPDATE

如果你正在寻找一个更完整的解决方案,可以做到以下几点:

.filter("decoder", function() { 
    return function (item) { 
    // it would be better to define this globally as opposed to within the function 
    var ENTITIES = { 
     '&amp': '&', 
     '&amp;': '&', 
     '&apos': '\'', 
     '&apos;': '\'', 
     '&gt': '>', 
     '&gt;': '>', 
     '&lt': '<', 
     '&lt;': '<', 
     '&quot': '"', 
     '&quot;': '"' 
    }; 
    return item.replace(/&#?[0-9a-zA-Z]+;?/g, function (entity) { 
     if (entity.charAt(1) === '#') { // if it's a numeric entity 
     var code; 

     if (entity.charAt(2).toLowerCase() === 'x') { // if it's a hex code 
      code = parseInt(entity.substr(3), 16); 
     } else { 
      code = parseInt(entity.substr(2)); 
     } 

     if (isNaN(code) || code < -32768 || code > 65535) { // if it's not a valid numeric entity 
      return ''; 
     } 
     return String.fromCharCode(code); 
     } 
     return ENTITIES[entity] || entity; 
    }); 
    } 
}); 

正如你可以看到,这个解决方案是显著更复杂,但它确实覆盖正常的实体以及所有数字的实体。如果您的目标是在未来避免更新,这是您最好的选择。

+0

这将起作用,我已经考虑过这个选项,不幸的是,未来可能会有新的实体被输入到内容中,这将涉及到添加和更新,我正在尝试为了避免,我感谢你的努力,尽管罗宾。 –