PHP-file_get_contents使用regex获取JSON,但可以't JSON解码(得到JSON_E

PHP - file_get_contents get JSON with regex, but can't JSON decode (got JSON_ERROR_SYNTAX)

本文关键字:JSON 得到 解码 contents get 使用 regex PHP-file 获取 但可以      更新时间:2023-09-26

我尝试解析此页面:http://fr.hearthhead.com/cards以获取炉石卡片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:(

有人有个主意?:)

问题是,当代码是真正成熟的JavaScript时,您会认为它是JSON。在该代码中,出现了许多属性名称popularity的无引号重复,这是一个良好的JavaScript,但无效的JSON。

我试图构建一个正则表达式来修复任何未引用的属性名称。问题是,这是不可行的。在我的例子中,值中的任何冒号都破坏了我的正则表达式。

除了编写一个解析器来修复这种不符合项或调用JS解释器(这需要一个外部依赖项,如V8Js)之外,我认为您现在可以修复这个特定的场景:

$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,并将错误记录在你经常检查的地方,甚至可以自己发出通知。虽然我会这么做,但我认为这不太可能,因为所有其他属性都被正确引用了。