2015-05-08 94 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

這將起作用,我已經考慮過這個選項,不幸的是,未來可能會有新的實體被輸入到內容中,這將涉及到添加和更新,我正在嘗試爲了避免,我感謝你的努力,儘管羅賓。 –