2014-01-11 248 views
0

我使用php json_decode解析API响应,然后json_encode发送响应到客户端。php json_decode删除html标签

在第三方API调用中,我得到JSON响应,其中有一个具有html标记和html内容的值的键。当我打印这些数据时,我可以看到这些标签,但在json_decode之后,我看不到这些标签,因此我无法保持这些标签的完整性。我希望这些html内容能够直接进入数据库[没有任何改变]。

$result = curlGetWithHeaders("API URL", "Parameters for that URL");

$data = json_decode($result);

所以在$result我可以看到html标签,但不是在$data。 而var_dump($data)表示它是string

响应是= {"array":{"id":1,"title":"Title","short_title":"abcd","description":"<ul><li>0</li><li>A</li><li>B</li><li>C</li><li>D</li>"}}

,并使用json_decode我越来越描述为pasred HTML后。

deals] => Array ( [0] => stdClass Object ( [deal] => stdClass Object ( [id] => 1 [title] => title [short_title] => abcd [description] => 0 • A • B • C

+0

附近的[此问题](http://stackoverflow.com/questions/3837435/decoding-html-tags-using-json-decode-function)。那里的选择答案不那么恒星,恕我直言。 –

+0

感谢您的回复,这意味着我应该使用'str_replace'来替换''为'<''''''为'>' – Pranav

+0

你能举一个例子吗? –

回答

2

是类似的东西:

stdClass的对象([数组] => stdClass的对象([ID] => 1 [标题] =>标题[short_title] => ABCD [描述] =>

  • Ç
  • d

然而,你的对象的有效内容(没有浏览器解释HTML标记)是这:

stdClass Object 
(
    [array] => stdClass Object 
    (
     [id] => 1 
     [title] => Title 
     [short_title] => abcd 
     [description] => <ul><li>0</li><li>A</li><li>B</li><li>C</li><li>D</li> 
    ) 
) 

如果您要求浏览器显示页面的来源,您可以清楚地看到它。

您的description字段包含一个纯粹的字符串,它恰好是HTML,就是这样。

如果你要存储在数据库中的JSON解码的数据没有任何修饰,好了,没有做任何事情,你会得到你想要的东西。

现在,如果你想在你的浏览器中显示实际的HTML代码,你将不得不逃离HTML特殊字符,像这样:

echo htmlentities (print_r (json_decode ($json), true)); 

请注意,您应该首先得到print_r结果,只有然后转义HTML。

+0

你的位置在这方面。然而,我不知道他是如何在没有浏览器解析HTML的情况下输出'$ result'? – user555

+0

只要HTML标签位于带引号的字符串中,它们就不会被解释,所以JSON数据的'print_r'将显示引用的HTML代码,而不需要浏览器解释它。 –

+0

我正在使用chrome查看'network'请求响应。 – Pranav

0

不知道是否有帮助,但...

$p = '<p> This is some text</p>'; 

$j = json_encode(urlencode($p)); 

print_r($j); 

echo '<br>'; 

$jd = json_decode(urldecode($j)); 

print_r($jd); 
1

使用的htmlspecialchars()函数来编码第一

的数据,并使用htmlspecialchars_decode()函数来取回结果

<?php 

    $result = htmlspecialchars({"array":{"id":1,"title":"Title","short_title":"abcd","description":"<ul><li>0</li><li>A</li><li>B</li><li>C</li><li>D</li>"}}); 

使用它,当想要回HTML内容

htmlspecialchars_decode()当您使用print_r,以显示你的JSON解码的对象,你在你的浏览器中看到的内容,以获取HTML内容后面

+0

感谢您的回应,但我在API响应中获取数据,所以我需要先对它进行json_decode。 'htmlspecialchars'无法解码为json,因为它甚至替换了'双引号'。 – Pranav

+0

ENT_NOQUOTES使用此标志 – sanjeev

+0

htmlentities($ result,ENT_NOQUOTES); – sanjeev

1
$result = '{"array":{"id":1,"title":"Title","short_title":"abcd","description":"<ul><li>0</li><li>A</li><li>B</li><li>C</li><li>D</li>"}}'; 
$data = json_decode($result); 
print "<pre>"; 
print_r($data); 
print "</pre>"; 

在这里你的json字符串已经转换为数组,其中“description”包含html标签。与print_r你会看到HTML标记,因为它被浏览器解释,你会看到HTML会产生的结果。

现在,如果您想用HTML压缩文本,您可以使用htmlentities,如下所示。

print htmlentities($data->array->description);  

输出:

<ul><li>0</li><li>A</li><li>B</li><li>C</li><li>D</li> 
+0

...或者你可以简单地显示页面源代码。保存一些打字:)。 –

+0

@kuroineko或者'var_dump()'更好的Xdebug。 – user555

0

不完全回答我的问题,但它可以帮助别人,无论我在DB中存储是完美的。显示时出现问题。所以现在我可以用<pre></pre>标签来完成它,它将在显示时格式化数据。它只是为我工作。