如何用PHP Simple HTML DOM Parser提取页面内嵌JS中的位置数据
提取内嵌JS中__INITIAL_STATE__字段的方法
嘿,这个场景我熟!要从页面内嵌的script#state标签里拿到window.__INITIAL_STATE__里的country、state、zipCity,其实就是先定位脚本内容,再用正则抠出JSON,最后解析成PHP变量的过程,给你一步步拆解:
1. 用PHP Simple HTML DOM Parser定位目标脚本
你已经在用这个解析器了,先把页面HTML加载进来,精准定位到id="state"的script标签:
// 假设你已经获取到页面HTML内容并存入$html_content变量 require_once 'simple_html_dom.php'; $html = str_get_html($html_content); // 找到id为state的第一个script标签(避免页面有多个同名标签的情况) $script_tag = $html->find('script#state', 0); // 先检查是否找到标签,避免后续报错 if (!$script_tag) { die("找不到id为state的script标签"); } // 提取标签内的脚本文本 $script_content = $script_tag->innertext;
2. 用正则匹配出__INITIAL_STATE__的JSON内容
通常window.__INITIAL_STATE__的格式是window.__INITIAL_STATE__ = { ... };,我们需要把大括号里的JSON部分抠出来:
// 正则匹配window.__INITIAL_STATE__后的JSON对象 preg_match('/window\.__INITIAL_STATE__\s*=\s*({.*?});/s', $script_content, $matches); // 检查是否匹配到有效内容 if (!isset($matches[1])) { die("无法匹配到__INITIAL_STATE__的JSON内容"); } // 拿到纯净的JSON字符串 $initial_state_json = $matches[1];
这里的s修饰符很关键,它能让正则里的.匹配换行符,避免因为JSON多行排版导致匹配失败。
3. 解析JSON为PHP数组,提取目标变量
把JSON转成PHP关联数组后,就能直接提取你需要的字段了:
// 将JSON解析为关联数组(第二个参数true表示转数组而非对象) $initial_state = json_decode($initial_state_json, true); // 检查JSON解析是否成功 if (json_last_error() !== JSON_ERROR_NONE) { die("JSON解析失败:" . json_last_error_msg()); } // 提取目标变量,用?? null做容错,避免字段不存在时报错 $country = $initial_state['country'] ?? null; $state = $initial_state['state'] ?? null; $zip_city = $initial_state['zipCity'] ?? null; // 可以打印验证结果 var_dump($country, $state, $zip_city);
额外提醒
- 注意字段名的大小写!比如
zipCity是驼峰命名,PHP里要完全对应,不然会取到空值。 - 如果页面里的
__INITIAL_STATE__写法有细微差异(比如没有空格、末尾没有分号),正则里的\s*也能兼容,不用特意修改。 - 要是JSON里有注释,json_decode会失败,这种情况需要先去掉注释(不过生产环境的初始化状态一般不会加注释)。
内容的提问来源于stack exchange,提问作者medk
相关产品推荐
相关产品推荐

