gpt4 book ai didi

javascript - PHP - file_get_contents 使用正则表达式获取 JSON,但无法解码 JSON(获取 JSON_ERROR_SYNTAX)

转载 作者:行者123 更新时间:2023-11-30 00:19:06 29 4
gpt4 key购买 nike

我尝试解析此页面: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);

我尝试了所有我能找到的技巧(trim、stripslashes、BOM 的 preg 和其他东西,在 json_decode 上放置标志和许多其他东西),但我没有得到这个工作。

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

有人有想法吗? :)

最佳答案

问题是您假设代码是 JSON,而实际上它是成熟的 JavaScript。在该代码中,属性名称 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 并将错误记录在您经常检查的地方,甚至尽可能以某种方式为自己发出通知。尽管我会这样做,但我认为这不太可能发生,因为所有其他属性都被正确引用了。

关于javascript - PHP - file_get_contents 使用正则表达式获取 JSON,但无法解码 JSON(获取 JSON_ERROR_SYNTAX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33839542/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com