使用php从javascript代码中提取JSON
我想在使用php从javascript代码中提取JSON,javascript,php,json,regex,Javascript,Php,Json,Regex,我想在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.
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
有人能告诉我怎么做吗?如果您的数据总是相同的,您可以使用下面这样的简单正则表达式 但是如果你的网站正在改变或者有更多不同的页面,那么你必须使用其他页面
如果数据变量结构始终相同:
preg_match('/\s?data\s?\=\s?(\{[^\;]+\})/i',$images_script,$matches);
$parsed=json_decode(str_replace("'",'"',$matches[1]),true);
o如果您只想要具有相应分辨率的图像,请尝试
\”([^\“]+)\”\s?\:\s?\“(https?\:\/\/[^\“]+)\”
您与preg_match尝试非常接近,您只需使用
s
标志(单行标志)
顺便说一句,记住捕获的json最后将包含
;
,因为您使用A.trigger
作为边界使用html解析器,然后使用javascript解析器。如果将其提取为字符串,您将发现它不是有效的json。(您必须将所有单引号更改为双引号。)@Umair,“它是有效的。”(如果您将其更改为有效)”。它是有效的JavaScript,但不是有效的JSON。无论如何,如果您想要可靠地解析它,您将需要一个功能齐全的JavaScript解析器。我不知道从PHP中有什么干净的方法可以做到这一点。@Umair,它无效。JSON字符串必须使用双引号,就像NNNN所说的。您的链接甚至说了同样的话:“错误:字符串应该用双引号括起来。”@Umair,你能吗?关于{'foo':'bar'baz'}
或{foo:“bar'baz”}
?你应该真正用JavaScript(因为这是你拥有的)来思考,而不是JSON(你没有)。这不是一个简单的任务。正则表达式不能用于可靠地匹配JavaScript对象或JSON,因为它们嵌套了{}
和平衡的“
。这很有效…我有另一个JS字符串…但它有第一个单词定义(“产品/数据”),
和第二个单词定义(“athena/analytics数据”,null)
我想获取这两个单词之间的数据…怎么做?您使用的正则表达式不能处理此问题string@Umair这个正则表达式还不够吗?@Umair,这是一个与你发布的问题不同的问题。你应该将这个问题标记为“已解决”打开一个新问题。正则表达式应该适用于所有字符串…意味着它应该是一个通用解决方案对于“如何获取两个给定字符串之间的子字符串”…@Umair,如果我错了,请更正我…您没有要求获取var data={
和A.trigger
?这就是我的答案。如果你想得到不同字符串之间的字符串,那么这是一个不同的问题。另一方面,我的意思是,你想用相同的模式捕获多个字符串,那么你必须使用preg\u match\u all
。
$mathes=[];
preg_match_all('/\"([^\"]+)\"\s?\:\s?\"(https?\:\/\/[^\"]+)\"/im',$your_text,$matches);
preg_match('~var data =(.*?)A.trigger~s', $images_script, $output);
Here -----^