2012-04-04 169 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