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

使用Regex与PHP从HTML中提取JavaScript对象的问题

解决正则匹配含换行的JavaScript对象问题

我明白你遇到的困扰了——当HTML里的JS代码带有换行时,你写的正则就抓不到完整的DATA.tracking.user对象了。这其实是正则默认行为导致的小问题,咱们一步步解决它:

问题根源

你用的正则DATA.tracking.user=(.*?)}里,.这个元字符默认不匹配换行符。一旦目标内容里出现换行,.*?就会在换行处停止匹配,自然拿不到完整的对象内容。

两种可行的解决方案

方案1:启用DOTALL模式(PHP正则的s修饰符)

在PHP正则表达式末尾加上s修饰符,就能让.匹配包括换行在内的所有字符。修改后的正则和PHP代码如下:

<?php
$html = '<script> DATA.tracking.user = { age: "19", name: "John doe" } </script>';
// 加上s修饰符,让.匹配换行
$re = '/DATA.tracking.user=(.*?)}/s';
preg_match($re, $html, $matches);
if (!empty($matches[1])) {
    // 去除多余空格后补全对象闭合符
    $userData = trim($matches[1]) . '}';
    echo $userData;
}

方案2:用[\s\S]*?替代.*?

如果你不想依赖修饰符,可以用[\s\S]这个字符集(它包含所有空白字符和非空白字符,自然覆盖换行)来替换.*?,这样不用加修饰符也能跨换行匹配:

<?php
$html = '<script> DATA.tracking.user = { age: "19", name: "John doe" } </script>';
$re = '/DATA.tracking.user=([\s\S]*?)}/';
preg_match($re, $html, $matches);
if (!empty($matches[1])) {
    $userData = trim($matches[1]) . '}';
    echo $userData;
}

额外提醒

虽然正则能解决简单场景,但如果你的DATA.tracking.user对象是嵌套结构,或者字符串里包含}字符,正则可能会匹配出错。这种情况下更靠谱的做法是:

  • 先用DOM解析器定位到对应的<script>标签内容
  • 再用JavaScript引擎(比如PHP的V8JS扩展)或者将内容转换为JSON格式后用json_decode解析(注意要把JS对象的属性名改成双引号,符合JSON规范)

内容的提问来源于stack exchange,提问作者Jrad51

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:00:26