我有一个HTML页面,在脚本标记中有一个非常大的和非常复杂的JSON块。
我想提取JSON,以便我可以在php脚本中解码它。
JSON看起来像:
<script type="text/javascript">
var user_list_data_obj = (
({
... truncated ...
})
);
... some more js ...
</script>
脚本标签不能在模式中使用,因为它们之间还有其他JS,并且无论如何都没有任何东西可以使它们无条件。
我相信我需要匹配变量名,第一次出现'}));'但是我尝试匹配它的尝试失败了。
到目前为止我得到的是:
$pattern = '/var user_list_data_obj = \(\s\(({.*})\)\s\);/';
什么都不返回。
我在这种模式中做错了什么?我知道很难匹配任何具有正则表达式的JSON等开放和结束分隔符的东西,但在这种情况下它应该是可能的,不是吗?
编辑:
我正在尝试将整个“user_list_data_obj”对象解析为我的php脚本。但实际上,我感兴趣的是几个“columns:[]”数组,所以如果更容易将它们分开,那么这样做可能是有道理的。
列[]数组看起来像
columns : [
{ display_value : '<input type="checkbox" name="user" value="username">'},
{ display_value : 'username', sort_value : 'username'},
{ display_value : 'username', sort_value : 'username'},
{ display_value : 'Enabled', sort_value : '1' },
{ display_value : '<img class="" src="/enabled.gif">', sort_value : '1' },
{ display_value : '<img class="" src="/enabled.gif">', sort_value : '1' },
{ display_value : '<img class="" src="/enabled.gif">', sort_value : '1' }
],
答案 0 :(得分:1)
我能得到的最接近的是
preg_match('/var user_list_data_obj = \(\s+\(({.*})\)\s+\);/s', $html, $matches);
s
修饰符允许匹配换行符。
这是不完美的,因为它对结构做出了假设:即你需要的JSON从字面上开始
( /* some space */
({
以
结束}) /* some space */
);
如果您无法做出这些假设,那么不太具体的正则表达式可能会与脚本的其他部分匹配。此外,如果您在不想要匹配的脚本中的某个位置}) );
,它仍将匹配。使用{.*?}
将不起作用,因为您要捕获的字符串中可能有许多嵌套对象文字。
答案 1 :(得分:1)
我能够将整个json对象与以下
匹配/user_list_data_obj\s*=\s*\(\s*\({(.*?)}\)\s*\);/
但实际上,我最终使用preg_match_all来匹配json中的每个columns []数组:
/columns\s*:\s*\[.*?\],/s