奇怪的Javascript结构

时间:2013-08-20 17:59:19

标签: php javascript arrays parsing

我正在尝试通过解析从网站获取信息,我发现了这段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 个答案:

答案 0 :(得分:5)

这是一个JavaScript对象文字。

如果你是直接从PHP获取它,你必须自己解析它(也许使用正则表达式就足够了)。我建议你也查看以下链接:

答案 1 :(得分: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
)

答案 2 :(得分:1)

那是JavaScript object literal。 JSON基于这种结构化数据样式。

如果您从JavaScript处理了这些数据,只需将其转换为JSON字符串:JSON.stringify(product);

从PHP中,只需通过JSON传输并使用json_decode

进行解码

如果您只将此脚本文件作为文本。然后,你需要谷歌,但想法是解析AST,选择你想要的作品,eval它(以一种有希望的安全方式)并使用它,或{{1}结果回到PHP。