2

我有一个 HTML 页面,它在脚本标签中有一个非常大且非常复杂的 JSON 块。

我想提取 JSON,以便可以在 php 脚本中对其进行解码。

JSON 看起来像:

<script type="text/javascript">
    var user_list_data_obj = (
    ({

    ... truncated ...

    })
    );

    ... some more js ...
</script>

脚本标签不能用在pattern中,因为它们之间还有其他的js,反正也没有什么可以让它们unqiue的。

我相信我需要匹配变量名,以及第一次出现的 '}));' 但我尝试匹配失败了。

到目前为止,我得到的是:

$pattern = '/var user_list_data_obj = \(\s\(({.*})\)\s\);/';

什么都不返回。

我在这种模式下做错了什么?我知道很难将任何具有打开和关闭分隔符(如 JSON 等)的东西与正则表达式匹配,但在这种情况下应该是可能的,不是吗?

编辑:

我正在尝试将整个“user_list_data_obj”对象解析到我的 php 脚本中。但实际上,我感兴趣的是几个“columns :[]”数组,所以如果将它们分开更容易,那么这样做可能是有意义的。

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' }
       ],
4

2 回答 2

2

我能够将整个 json 对象与以下内容匹配

/user_list_data_obj\s*=\s*\(\s*\({(.*?)}\)\s*\);/

但实际上,我最终使用 preg_match_all 来匹配 json 中的每个 columns[] 数组,方法是:

/columns\s*:\s*\[.*?\],/s
于 2013-05-10T19:53:04.770 回答
1

我能得到的最接近的是

preg_match('/var user_list_data_obj = \(\s+\(({.*})\)\s+\);/s', $html, $matches);

s修饰符允许匹配换行符。

这是不完美的,因为它对结构进行了假设:即您需要的 JSON 从字面上开始

( /* some space */
({

并以

}) /* some space */
);

如果您无法做出这些假设,则不太具体的正则表达式可能会匹配脚本的其他部分。此外,如果您}) );在脚本中的某个位置不想匹配,它仍然会匹配。使用{.*?}不起作用,因为您要捕获的字符串中可能有许多嵌套对象文字。

于 2013-05-10T18:07:12.210 回答