Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php从javascript代码中提取JSON_Javascript_Php_Json_Regex - Fatal编程技术网

使用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 -----^