您好我正在使用REST服务来提取数据并使用angular来打印前端的数据。
我遇到的问题是被拉过的字符串已经转移了像'这样的实体。而不是'(撇号)例如。 “受到了法国和最受欢迎的社区的启发。”
decodeURI似乎根本不起作用。
我找到了一个解决方法,通过创建自定义过滤器,使得创建一个虚拟元素,将innerHTML设置为虚拟元素,然后在解析并返回该值后获取它的innerHTML。
.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操纵的方法。
谢谢!
答案 0 :(得分:3)
您可以手动替换它们。
.filter("decoder", function () {
return function (item) {
return item
.replace(/'/g, "'")
.replace(/"/g, '"')
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
}
})
我认为此列表涵盖了所有这些,但如果您看到其他内容,则可以随时添加。它仍然有点混乱,但我认为它比向DOM添加元素更好。
<强>更新强>
如果您正在寻找更完整的解决方案,可以执行以下操作:
.filter("decoder", function () {
return function (item) {
// it would be better to define this globally as opposed to within the function
var ENTITIES = {
'&': '&',
'&': '&',
'&apos': '\'',
''': '\'',
'>': '>',
'>': '>',
'<': '<',
'<': '<',
'"': '"',
'"': '"'
};
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;
});
}
});
正如您所看到的,此解决方案要复杂得多,但它确实涵盖了普通实体以及所有数字实体。如果您的目标是避免将来更新,那么这是您最好的选择。
答案 1 :(得分:0)
您可以使用ng-bind-html而不是使用过滤器对其进行解码。我认为这可以帮助您自动解码html字符串中的实体。