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

标签 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);

我尝试了所有我能找到的技巧(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/

相关文章:

javascript - 无法在 Angular 2/4 中获取本月的第一天

php - get_user() 在 WordPress 上需要哪些文件

php - 生成随机 ENUM 值 [PHP, MySQL]

javascript - FabricJs:从 JSON 保存和加载动态模式 (patternSourceCanvas)

java - 如何使用 Jackson 反序列化对象数组

javascript - 在 Electron 中要求和扩展类,怎么做?

javascript - vendor Assets 是否应该包含在 Bower + Rails 的版本控制中?

javascript - 将 javascript 字符串中的所有字母和超过 2 个空格替换为空字符

javascript - 当时间到达 00h :59m : 59s 之后时,我的小时返回 0

javascript - 使用来自 bl.ocks.org 的力导向图示例