2013-08-20 90 views
2

我試圖從通過解析網站獲取信息,我發現這段JavaScript代碼:奇怪的Javascript結構

var product = { 
    identifier: '198980', 
    valid: '1378159199', 
    fn: 'Entrada para IMAX Barcelona, para cualquier sesión y día', 
    description: '', 
    category : [ 'Barcelona','Planes del día','Actividades'], 
    brand: '', 
    price: '5.00', 
    amount: '9.75', 
    currency: 'EUR', 
    url: 'http://es.letsbonus.com/ocio/barcelona/entrada-a-imax-port-vell-2013-08-02-198980', 
    photo: 'http://media5.letsbonus.com/products/198000/198980/13509238959102-0-680x276.jpg' 
}; 

正如你可以看到,這段JavaScript代碼中包含了大量的信息網站中的某個產品,因此解析它會很有趣。我可以看到這不是一個JSON對象,既不是一個Javascript數組。

我的問題是:

這是某種類型的JavaScript對象的?而且,如果是這樣,PHP中有沒有簡單的處理?我已經能夠在我的代碼中檢索這個特定的字符串。

+3

這是一個JavaScript對象文字。 – bfavaretto

+1

這是一個JavaScript對象。如果你將它看作文本,那麼快速/骯髒/危險的黑客就是簡單地「評估」它。 –

+0

我猜你眼中的主要區別在於鍵上缺少引號?在JS代碼中(可能還有一些JSON的定義)可以跳過。如果你可以跳過「var product =」,可能會有一些JSON解析器可以處理它,但我恐怕我不知道。 – Katana314

回答

2

這是一種特定類型的Javascript對象嗎?

由於其他人已經評論,這是一個JavaScript object literal MDN

而且,如果有的話,是否有任何簡單的PHP處理?我已經能夠在我的代碼中檢索這個特定的字符串。

好的,有一些簡單的處理。你得到的字符串非常接近JSON,UTF-8編碼,並且沒有特別逃脫或深度嵌套。

所以,你可以運行一些regular expression based search and replaces Docs,然後就json_decodeDocs它,如果返回NULL你發現了一個錯誤,否則,你肯定你的結果:

$buffer = <<<BUFFER 
var product = { 
    identifier: '198980', 
    valid: '1378159199', 
    fn: 'Entrada para IMAX Barcelona, para cualquier sesión y día', 
    description: '', 
    category : [ 'Barcelona','Planes del día','Actividades'], 
    brand: '', 
    price: '5.00', 
    amount: '9.75', 
    currency: 'EUR', 
    url: 'http://es.letsbonus.com/ocio/barcelona/entrada-a-imax-port-vell-2013-08-02-198980', 
    photo: 'http://media5.letsbonus.com/products/198000/198980/13509238959102-0-680x276.jpg' 
}; 
BUFFER; 

print_r(
    json_decode(
     preg_replace(
      [ 
       '/^\R?var product = ({.*});\R?$/s', 
       '/\'([^\']*+)\'/', 
       '/^({4})([a-z]+)\s*:/m', 
      ], 
      ['$1', '"$1"', '$1"$2":'], $buffer 
     ) 
    ) 
); 

輸出(Demo):

stdClass Object 
(
    [identifier] => 198980 
    [valid] => 1378159199 
    [fn] => Entrada para IMAX Barcelona, para cualquier sesión y día 
    [description] => 
    [category] => Array 
     (
      [0] => Barcelona 
      [1] => Planes del día 
      [2] => Actividades 
     ) 

    [brand] => 
    [price] => 5.00 
    [amount] => 9.75 
    [currency] => EUR 
    [url] => http://es.letsbonus.com/ocio/barcelona/entrada-a-imax-port-vell-2013-08-02-198980 
    [photo] => http://media5.letsbonus.com/products/198000/198980/13509238959102-0-680x276.jpg 
) 
1

這是一個JavaScript object literal。 JSON基於這種結構化的數據風格。

如果你有從JavaScript的這個數據的處理,只是變換它在一個JSON字符串:JSON.stringify(product);

從PHP,只是通過JSON發送出去,並與json_decode

解碼如果你只得到了這腳本文件作爲文本。然後,你需要谷歌周圍,但想法將解析AST,選擇你想要的,eval它(以一個希望安全的方式),並使用它,或JSON.stringify結果返回到PHP。

+0

我直接在PHP中,所以我不能使用'JSON.stringify(產品)' 。直接使用'eval'是太危險了,所以我必須通過正則表達式來處理它,正如bfavaretto所建議的那樣。 – markmb

+0

如果您喜歡它,但事實是您無法通過RegExp認真解析源代碼;他們不夠強大。之後,說eval是危險的是有點減少。當你編程時你所做的一切都可能是危險的或導致安全漏洞,這個想法是負責任的。 –

+0

但是,如果我在通過另一個網站的cURL獲取的大量數據上使用'eval',這可能非常有用且有幫助,但我更願意避免這種泄漏。 – markmb