You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:59:53