2

我试图通过解析从网站获取信息,我发现了这段 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 中是否可以轻松处理它?我已经能够在我的代码中检索这个特定的字符串。

4

3 回答 3

5

它是一个 JavaScript 对象字面量。

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

于 2013-08-20T18:01:19.370 回答
2

这是某种类型的 Javascript 对象吗?

正如其他人已经评论的那样,它是一个JavaScript 对象文字MDN

而且,如果是这样,在 PHP 中是否可以轻松处理它?我已经能够在我的代码中检索这个特定的字符串。

嗯,是的,有一些简单的处理。你得到的字符串非常接近 JSON,UTF-8 编码,没有特别转义,也没有深度嵌套。

因此,您可以运行一些基于正则表达式的搜索并替换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
        )
    )
);

输出(演示):

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
)
于 2013-08-20T18:57:27.850 回答
1

那是一个JavaScript 对象字面量。JSON 基于这种结构化数据样式。

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

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

如果您仅将此脚本文件作为文本获取。然后,您需要四处搜索,但想法是解析 AST,选择您想要的部分,eval它(以一种希望安全的方式)并将其用作它,或者JSON.stringify将结果返回给 PHP。

于 2013-08-20T18:03:08.523 回答