使用regex(PHP)从HTML页面中提取JSON

时间:2013-05-10 17:54:55

标签: php regex

我有一个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' }
       ],

2 个答案:

答案 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