【发布时间】: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