使用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
相关产品推荐
相关产品推荐

