PHP - file_get_contents用正则表达式获取JSON,但不能JSON解码(得到JSON_ERROR_SYNTAX)

时间:2015-11-21 03:56:59

标签: javascript php json regex

我尝试解析此页面:http://fr.hearthhead.com/cards以获取hearthstoneCards JS变量。 所以我做这样的事情:

$url = 'http://fr.hearthhead.com/cards';
$content = file_get_contents($url);
preg_match('#var hearthstoneCards = (.*)}]\;#Us', $content, $out);
$out = $out[1].'}]';
$tab_id_card = json_decode($out,true);

我尝试了我能找到的每一个技巧(修剪,剥离,BOM和其他东西的preg,在json_decode和许多其他东西上放置标志),但我没有得到这个工作。

如果我file_put_contents $ out var并与真实源进行比较则它是相同的(相同的长度)。如果我把字符串放在JS控制台上,我就会得到数据。但PHP不想解析这个var:(

有人有个主意吗? :)

1 个答案:

答案 0 :(得分:1)

问题是你假设代码是JSON,当它真的是完全成熟的JavaScript时。在该代码中,出现了许多不带引号的属性名称popularity的重复,这是很好的JavaScript,但是JSON无效。

我尝试构建一个正则表达式来修复任何不带引号的属性名称。问题是,这是不可行的。就我而言,任何冒号内的冒号都会破坏我的正则表达式。

如果没有编写解析器来修复此类不符合或调用JS解释器(这需要外部依赖项,如V8J),我认为您现在可以修复此特定方案:

$url = 'http://fr.hearthhead.com/cards';
$content = file_get_contents($url);
preg_match('#var hearthstoneCards = (.*)}]\;#Us', $content, $out);
$out = str_replace('popularity', '"popularity"', $out);
$out = $out[1].'}]';
$tab_id_card = json_decode($out,true);

如果您担心将来引入新的不带引号的属性,可以检查$tab_id_card NULL,并将错误记录到您经常检查的地方,甚至可以以某种方式为您自己发送通知。虽然我会这样做,但我认为这不是一个可能的情况,因为所有其他属性都被正确引用。