我尝试解析此页面: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:(
有人有个主意吗? :)
答案 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
,并将错误记录到您经常检查的地方,甚至可以以某种方式为您自己发送通知。虽然我会这样做,但我认为这不是一个可能的情况,因为所有其他属性都被正确引用。