我想我遇到html_entity_decode
的问题,可能有一个我还没有找到的简单解决方案。这是我的问题,我有这个字符串:
L'evento dell'anno
当我保存到我的数据库中时,会使用filter_var($input,FILTER_SANITIZE_STRING);
进行过滤并输出:
L'evento dell'anno
现在,当我直接从页面内的PHP中检索它时,我不需要编码/解码函数,并且文本显示正如我最初编写的那样,但是,当我从AngularJS加载它时(版本1) )$http.get()
它不会替换字符,如果我打印对象值,我会看到所有这些HTML实体(我认为它们是,我不确定)。
这是我的AngularJS代码部分:
$http.get(php_data.ajax_url, {
params: {
action: 'get-sostenitore',
get_id: show_id
}
}).then(function (response) {
// Handle data
});
// Handle data
部分仅打印结果,仅此而已。
没有用,所以我添加了这个PHP部分:
$decoded_vars = array_map(function ($val) {
return html_entity_decode($val, ENT_COMPAT,'UTF-8');
}, get_object_vars($object));
也不起作用。
我也试过了htmlentities_decode
mb_convert_encoding($val,'UTF-8','HTML-ENTITIES')
,但也转换了特殊字母(à,è等等)。
我一直在StackOverflow上搜索大约2个小时,我发现了一些结果,例如this,this或this(我发现了另一个完整的结果)这里有关SA编码/解码的指南,但我没有再找到它,但是没有一个能解决我的问题 有趣的是,我已尝试在online tool上粘贴我的字符串,并且显示正确 它可能是一个AngularJS问题吗?我为此感到生气,但我确信它有一个非常简单的解决方案
即使我已经解决了我的问题,我认为这是一个与PHP相关的问题,而不是JS,但我确实错了,所以我将通过展示我如何使用数据来更新AngularJS
部分我明白了:
JS代码
app.controller('eventController', ['$http', '$scope', '$httpParamSerializerJQLike', '$interval', 'ngDialog', function ($http, $scope, $httpParamSerializerJQLike, $interval, ngDialog) {
var event = this;
$http.get(php_data.ajax_url, {
params: {
action: 'get-event',
get_id: show_id
}
}).then(function (response) {
// Handle data
if(response.status === 200){
var data = response.data;
ngDialog.open({
className: 'ngdialog-theme-default',
data: data,
controller: 'dialogEventi'
controllerAs: 'evView'
});
}
});
}]);
app.controller('dialogEventi', ['$http', '$scope', '$interval', '$httpParamSerializerJQLike', function ($http, $scope, $interval, $httpParamSerializerJQLike) {
var evView = this;
evView.loadedItem = $scope.ngDialogData;
}]);
弹出代码
<div id="show-event" class="bpopup-popup">
<div class="popup-head">
<h2>Visualizza evento</h2>
</div>
<div class="popup-body clearfix">
<div>
<div class="form-group" ng-show="evView.loadedItem.titolo">
<label>Titolo:</label>
{{evView.loadedItem.titolo}}
</div>
<div class="form-group" ng-show="evView.loadedItem.descrizione">
<label>Descrizione:</label><br/>
{{evView.loadedItem.descrizione}}
</div>
<div class="form-group" ng-show="evView.loadedItem.dataora">
<label>Data:</label>
{{evView.loadedItem.dataora}}
</div>
<div class="form-group" ng-show="evView.loadedItem.luogo">
<label>Luogo:</label>
{{evView.loadedItem.luogo}}
</div>
<div class="form-group" ng-show="evView.loadedItem.indirizzo">
<label>Indirizzo:</label>
{{evView.loadedItem.indirizzo}}
</div>
</div>
</div>
</div>
答案 0 :(得分:1)
因此,角度{{}}
或ng-bind
仅显示文字。您可以通过创建dom元素,将字符串作为html插入并将其作为文本检索,在浏览器中简单地转换html实体。
// simple helper function
function decode_entities(str){
return angular.element('<div>').html(str).text()
}
当您收到数据
时,它可以用作角度过滤器或前任data.forEach(function(item){
item.description = decode_entities(item.description);
});
答案 1 :(得分:1)
使用FILTER_SANITIZE_FULL_SPECIAL_CHARS
手册说它会做单引号和双引号。因为它与htmlspecialchars()
类似,但与ENT_QUOTES
相似。也许这就是你所需要的。
答案 2 :(得分:0)
经过数小时的搜索,我找到了一个angular-sanitize
的解决方案,我找到了here。所以,为了解决我的问题,我刚刚添加ngSanitize
作为模块依赖。
无论如何,感谢你的所有答案,我发现每一个都有一些有趣的东西,我会记住。