将编码的 PHP JSON 传递给 JavaScript


pass encoded php json to javascript

我用PHP和javascript制作的应用程序有问题。

我有一个对函数 php 的 ajax 调用,该函数从数据库中获取值。我检索了许多带有字段的记录,其中有一个名为 description 的字段,其值如下所示:

<p><strong>TEST IT</strong></p><p>non gras<span style="color: rgb(192, 145, 0);">sett</span>o  </p>

在我对 json 进行编码后,在 javascript 中获取它并打印它。但结果是:

TEST+IT
non+grassetto++

我的代码是这样的:

AJAX 调用:

$.ajax({   
                url: site_url_database, 
                type: "GET", 
                async: true,
                data: window.location.search, 
                dataType: "json",
                timeout: 30000,
                success: function(data) {
                    _.each(data.hotel, function(d, index_d) {
                        data.hotel[index_d].description = decodeURIComponent(d.description);
                    });
                },
                error: function(data) {
                }
            })

PHP函数获取字段说明:

....
$hotel_array['description'] = urlencode($row->hotel_description);
....
//encode array to return
$hotel_array = json_encode($hotel_array);
echo($hotel_array);

在我用javascript(Backbone)打印它之后,但是如果我做一个console.log(),我会得到这个:

TEST+IT
    non+grassetto++

如何打印好?

谢谢

附言我无法更改工作方法,所以我需要一个 ajax 调用函数 php 并将其打印在 Backbone/javascript 中,我只需要很好地编码和解码

我已经在 php 中尝试过:

$hotel_array['description'] = addslashes(htmlentities($row->hotel_description));

在javascript中,我尝试使用:https://raw.githubusercontent.com/kvz/phpjs/master/functions/url/urldecode.js

HTML 实体解码

Javascript的decodeURIComponent()不会删除PHP urlencode()添加的+个字符;它期望空间被编码为%20,而不是+

$hotel_array['description'] = urlencode($row->hotel_description);
php > echo $hotel_array['description'];
%3Cp%3E%3Cstrong%3ETEST+IT%3C%2Fstrong%3E%3C%2Fp%3E%3Cp%3Enon+gras%3Cspan+style%3D%22color%3A+rgb%28192%2C+145%2C+0%29%3B%22%3Esett%3C%2Fspan%3Eo++%3C%2Fp%3E

然后,在Javascript中:

>js s = '%3Cp%3E%3Cstrong%3ETEST+IT%3C%2Fstrong%3E%3C%2Fp%3E%3Cp%3Enon+gras%3Cspan+style%3D%22color%3A+rgb%28192%2C+145%2C+0%29%3B%22%3Esett%3C%2Fspan%3Eo++%3C%2Fp%3E';
>js decodeURIComponent(s);
<p><strong>TEST+IT</strong></p><p>non+gras<span+style="color:+rgb(192,+145,+0);">sett</span>o++</p>

如您所见,+字符保留在解码的字符串中。

相反,您可以使用 RFC 3986 之后的rawurlencode()并将空格编码为 %20

php > $s = rawurlencode('<p><strong>TEST IT</strong></p><p>non gras<span style="color: rgb(192, 145, 0);">sett</span>o  </p>');
php > echo $s;
%3Cp%3E%3Cstrong%3ETEST%20IT%3C%2Fstrong%3E%3C%2Fp%3E%3Cp%3Enon%20gras%3Cspan%20style%3D%22color%3A%20rgb%28192%2C%20145%2C%200%29%3B%22%3Esett%3C%2Fspan%3Eo%20%20%3C%2Fp%3E

然后在Javascript中:

js> decodeURIComponent('%3Cp%3E%3Cstrong%3ETEST%20IT%3C%2Fstrong%3E%3C%2Fp%3E%3Cp%3Enon%20gras%3Cspan%20style%3D%22color%3A%20rgb%28192%2C%20145%2C%200%29%3B%22%3Esett%3C%2Fspan%3Eo%20%20%3C%2Fp%3E');
<p><strong>TEST IT</strong></p><p>non gras<span style="color: rgb(192, 145, 0);">sett</span>o  </p>

或者,如果不能修改 PHP 代码,可以手动将 + 替换为 ' '

js> s = '%3Cp%3E%3Cstrong%3ETEST+IT%3C%2Fstrong%3E%3C%2Fp%3E%3Cp%3Enon+gras%3Cspan+style%3D%22color%3A+rgb%28192%2C+145%2C+0%29%3B%22%3Esett%3C%2Fspan%3Eo++%3C%2Fp%3E';
js> decodeURIComponent(s).replace(/'+/g, ' ');
<p><strong>TEST IT</strong></p><p>non gras<span style="color: rgb(192, 145, 0);">sett</span>o  </p>

看起来 PHP 在将 HTML 标记传递给浏览器之前正在剥离它。在对 PHP 函数进行编码之前,请检查以确保 PHP 函数中没有strip_tags()函数。