【发布时间】:2019-04-16 22:44:49
【问题描述】:
我通过 phpQuery 获取一页 html 源代码,然后通过 php regex 从 head 中的脚本标记获取以下字符串代码:
var BASE_DATA = {
userInfo: {
id: 0,
userName: 'no-needed',
avatarUrl: 'no-needed',
isPgc: false,
isOwner: false
},
headerInfo: {
id: 0,
isPgc: false,
userName: 'no-needed',
avatarUrl: 'no-needed',
isHomePage: false,
crumbTag: 'no-needed',
hasBar: true
},
articleInfo:
{
title: 'needed',
content: 'needed',
groupId: 'needed',
itemId: 'needed',
type: 1,
subInfo: {
isOriginal: false,
source: 'needed',
time: 'needed'
},
tagInfo: {
tags: [{"name":"no-needed 1"},{"name":"no-needed 2"},{"name":"no-needed 3"}],
groupId: 'no-needed',
itemId: 'no-needed',
repin: 0,
},
has_extern_link: 0,
coverImg: 'no-needed'
},
commentInfo:
{
groupId: 'no-needed',
itemId: 'no-needed',
comments_count: 151,
ban_comment: 0
},};
我想把这个字符串转换成php数组,比如:
$base_data = array(
'articleInfo' => array(
'title' => 'needed',
'content' => 'needed',
'groupId' => 'needed',
'itemId' => 'needed',
'subInfo' => array(
'source' => 'needed',
'time' => 'needed',
),
));
或
$base_data = array(
'title' => 'needed',
'content' => 'needed',
'groupId' => 'needed',
'itemId' => 'needed',
'subInfo' => array(
'source' => 'needed',
'time' => 'needed',
),);
我已经尝试了很多方法,例如:json_decode,通过php regex和函数preg_match_all从大括号中获取内容。但是它们都运行得不好。
我尝试了两种方法:
第一种方式:
$json = str_ireplace(array('var BASE_DATA =', '};'), array('', '}'), $js);
json_decode($json, true);
第二种方式:
preg_match_all('/\{([^}]+)\}/', $js, $matches);
print_r($matches[1]);
或
preg_match_all('/articleInfo:\s*\{([^}]+)\}/', $script_text, $matches);
print_r($matches[1][0]);
似乎快要结束了,但看起来还是不太好,我必须在 articleInfo 部分解析字符串....这就是我发布这篇文章的原因。
我什至想用 V8 JavaScript 引擎,但是.....
请问有谁知道完成它的更好方法吗?
【问题讨论】:
-
如果源字符串包含
var BASE_DATA =部分,则在将其剥离之前,您将无法对其进行 json_decode。最后的逗号也是一个问题,它可能会或可能不会抱怨最后一个分号。在这方面不确定 json_decode 有多宽容。 -
是的,我已经发现了这个问题,所以我已经尝试过 str_ireplace(array('var BASE_DATA =', '};'), array('', '}'), $js) ;但我确实知道接下来我应该做什么。实际上,我也尝试过: preg_match_all('/\{([^}]+)\}/', $js, $matches);它似乎接近完成,但看起来仍然不太好,我必须在 articleInfo 部分解析字符串....这就是我发布这篇文章的原因。
-
“我已经尝试了很多方法”确实告诉...
-
@miken32 我编辑了,请检查
标签: javascript php regex parsing