2012-04-04 180 views
1

所以我有一个看起来很简单的问题,尽管对于我而言,由于缺乏编码知识,我无法弄清楚。请原谅任何错误的人!所以我有一个URL标题,它包含一个带有JSON字符串的签名请求(这是一个Facebook页面)。我需要检索该JSON字符串,然后只提取它的特定部分。目前我无法控制URL的格式。用PHP从JSON字符串中提取特定值

在它去,我有以下的代码页:

<?php 
$signed_request = $_REQUEST['signed_request']; // Get the POST signed_request variable. 

if(isset($signed_request)) // Determine if signed_request is blank. 
{ 
$pre = explode('.',$signed_request); // Get the part of the signed_request we need. 
$json = base64_decode($pre['1']); // Base64 Decode signed_request making it JSON. 
$obj = json_decode($json,true); // Split the JSON into arrays. 

echo $obj['app_data']; 
} 
else 
{ 
die('No signed request avaliable.'); //If there is no signed_request, stop processing script. 
} 
?> 

这工作正常,并且回声$的obj [ 'app_data文件'];打印:{q:“id_src = abc123456789”,}

对我来说,这本身就是一个JSON字符串,所以我想我可以运行一个json_decode然后打印出id_src = abc123456789。我想,这样的:

$appdata = $obj['app_data']; 
$idcode = json_decode($appdata,true); 

其次回声$ IDCODE [“Q”],但只是打印一个大括号。我尝试了各种变化,删除''标记,删除真实等。

我的最终目标是提取abc123456789值,而不是id_src部分。我想这可能会更快,因为我不太可能在接下来的几天中发现它。

感谢您的帮助!

编辑:添加了$ json的片段。 echo $ json;打印以下内容

{"algorithm":"HMAC-SHA256","app_data":"{q:\"id_src=abc123456789\",}","issued_at":1333500860,"page":{"id":"380641958713853","liked":false,"admin":true},"user":{"country":"nz","locale":"en_GB","age":{"min":21}}} 

是否会导致问题的id_src值后的逗号?

+0

你能后您发表返回的JSON的片段'BASE64_DECODE()'呢?有可能你的JSON在获取它的过程中被破坏了,但是我们无法确切知道没有它的一小部分。 – Bojangles 2012-04-04 00:46:51

+0

已编辑,添加了片段 – Dave 2012-04-04 00:56:20

回答

2

您可以提取你想要这样的东西:

preg_match('/"\\w+?=(\\w+?)"/', $obj['app_data'], $matches); 

print_r($matches); // Array ([0] => "id_src=abc123456789" [1] => abc123456789) 
+0

我的英雄!谢谢,print_r($ matches [1])正好打印我想要的东西。 – Dave 2012-04-04 01:02:35

+0

竖起大拇指的答案,如果它帮助你:D – 2012-04-04 01:13:11

0

{q:"id_src=abc123456789",}是无效的JSON。尝试{"q":"id_src=abc123456789"}

+0

嗯,这就是json_decode函数打印出来的内容,它来自传入iFrame的signed_request的解码。所以这可能意味着app_data被附加到URL的方式有错误 - 是否有任何方法来提取id_src值? – Dave 2012-04-04 00:53:08