【问题标题】:extract JSON from a javascript code using php使用 php 从 javascript 代码中提取 JSON
【发布时间】:2017-01-02 10:58:34
【问题描述】:

我想提取 var data = {A.trigger 之间的 JSON ...

$images_script = <<<EOM

P.when('A').register("ImageBlockATF", function(A){
    var data = {
                'colorImages': { 'initial': [{"hiRes":"https://images-na.ssl-images-amazon.com/images/I/61z4lNt%2BjZL._SL1300_.jpg","thumb":"https://images-na.ssl-images-amazon.com/images/I/31%2BSEYm%2B8QL._SS40_.jpg","large":"https://images-na.ssl-images-amazon.com/images/I/31%2BSEYm%2B8QL.jpg",
"main":{"https://images-na.ssl-images-amazon.com/images/I/61z4lNt%2BjZL._SY355_.jpg":[355,355],"https://images-na.ssl-images-amazon.com/images/I/61z4lNt%2BjZL._SY450_.jpg":[450,450],"https://images-na.ssl-images-amazon.com/images/I/61z4lNt%2BjZL._SX425_.jpg":[425,425],"https://images-na.ssl-images-amazon.com/images/I/61z4lNt%2BjZL._SX466_.jpg":[466,466],"https://images-na.ssl-images-amazon.com/images/I/61z4lNt%2BjZL._SX522_.jpg":[522,522]},"variant":"MAIN"}]},
                'colorToAsin': {'initial': {}},
                'holderRatio': 1.0,
                'holderMaxHeight': 700,
                'weblabs' : {}
                };
    A.trigger('P.AboveTheFold'); // trigger ATF event.
    return data;
});        
EOM;

我试过了

$startsAt = strpos($out, "var data = {") + strlen("var data = {");
$endsAt = strpos($out, "A.trigger", $startsAt);
$result = substr($out, $startsAt, $endsAt - $startsAt);

也尝试过

preg_match('~var data =(.*?)A.trigger~', $images_script, $output);

但我无法获取该 JSON。

谁能告诉我该怎么做?

【问题讨论】:

  • 使用 html 解析器,然后使用 javascript 解析器。
  • 如果您将其提取为字符串,您会发现它不是有效的 JSON。 (您必须将所有单引号更改为双引号。)
  • @Umair,“它是有效的(如果你改变它使其有效)”。它是有效的 JavaScript,但不是有效的 JSON。无论如何,如果您想可靠地解析,您将需要一个功能齐全的 JavaScript 解析器。我不知道有任何干净的方法可以从 PHP 中做到这一点。
  • @Umair,它是无效有效的JSON。 JSON 字符串 必须 使用双引号,就像 nnnnnn 所说的那样。你的链接甚至说同样的:“错误:字符串应该用双引号引起来。”
  • @Umair,可以吗? {'foo': 'bar"baz'}{"foo": "bar'baz"} 呢?你真的应该考虑 JavaScript(因为那是你所拥有的),而不是 JSON(你没有)。这不是一项简单的任务。正则表达式不能用于可靠地匹配 JavaScript 对象或 JSON,因为它们嵌套了 {} 和平衡的 "

标签: javascript php json regex


【解决方案1】:

您与 preg_match 尝试非常接近,您只需使用 s 标志(单行标志)

preg_match('~var data =(.*?)A.trigger~s', $images_script, $output);
                            Here -----^

Working demo

IDEOne demo

顺便说一句,请记住,捕获的 json 将在末尾包含 ;,因为您使用 A.trigger 作为边界

【讨论】:

  • 这行得通……我有另一个 JS 字符串……但是第一个单词 define("product/data", 和第二个单词 define("athena/analytics-data", null) 我想在这两个单词之间获取数据……怎么办去做?您 psoted 的正则表达式不适用于此字符串
  • @Umair 这个正则表达式还不够吗? demo
  • @Umair,这与您发布的问题不同。您应该将此标记为已解决并打开一个新问题。
  • 正则表达式应该适用于所有字符串......意味着它应该是“如何在两个给定字符串之间获取子字符串”的通用解决方案......
  • @Umair 纠正我如果我错了...你不是要求得到var data = {A.trigger 之间的字符串吗?这就是我所回答的。如果你想获得不同字符串之间的字符串,那么这是一个不同的问题。另一方面,我的意思是你想捕获具有相同模式的多个字符串,那么你必须使用preg_match_all
【解决方案2】:

如果您的数据始终相同,您可以使用如下所示的简单正则表达式

但如果您的网站正在发生变化或有更多不同的页面,那么您必须使用其他方式


如果 data var 结构始终相同:

preg_match('/\s?data\s?\=\s?(\{[^\;]+\})/i',$images_script,$matches);
$parsed=json_decode(str_replace("'",'"',$matches[1]),true);

php result here

o 如果您只想要具有相应分辨率的图像,请尝试this

\"([^\"]+)\"\s?\:\s?\"(https?\:\/\/[^\"]+)\"

$mathes=[];
preg_match_all('/\"([^\"]+)\"\s?\:\s?\"(https?\:\/\/[^\"]+)\"/im',$your_text,$matches);

php Result is here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2012-05-26
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多