利用php正则解析JSON数据_通过php正则提取JSON内容的技巧

絕刀狂花
发布: 2025-09-29 15:32:01
原创
416人浏览过
首先使用正则表达式提取嵌套JSON,再清洗并解析;例如用preg_match配合递归模式'/{(?:1|(?R))*}/s'提取对象,str_replace修复引号,最后json_decode解析,适用于日志或HTML中提取JSON,但需注意复杂场景下的局限性。{} ↩

利用php正则解析json数据_通过php正则提取json内容的技巧

在处理一些非标准格式的文本时,可能会遇到嵌入在普通文本中的 JSON 数据。虽然 PHP 提供了 json_decode() 函数来解析标准 JSON 字符串,但如果 JSON 被包裹在 HTML、日志或 JavaScript 代码中,就需要先提取出有效的 JSON 内容。这时可以借助正则表达式来定位并提取 JSON 片段。

识别常见的 JSON 模式

JSON 数据通常以对象({})或数组([])的形式出现。使用正则匹配时,关键是识别这些起始和结束符号,并确保括号层级正确闭合。

常见场景包括:

  • JavaScript 变量赋值:var data = {"name": "张三", "age": 25};
  • HTML 中内联脚本:<script>init({list: [{"id":1}]})</script>
  • 日志文件中包含结构化数据

我们可以编写一个能匹配最外层闭合的大括号或中括号内容的正则表达式。

立即学习PHP免费学习笔记(深入)”;

使用递归正则提取完整 JSON

由于 JSON 可以嵌套,简单的 \{.*\} 容易因贪婪匹配或多段 JSON 而失败。PHP 的 PCRE 扩展支持递归模式,适合处理嵌套结构。

以下是一个提取最外层 JSON 对象的示例:

preg_match('/\{(?:[^{}]|(?R))*\}/s', $text, $matches); $raw_json = $matches[0] ?? '';

说明:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
  • \{\} 匹配花括号
  • [^{}] 匹配非括号字符
  • (?R) 表示递归整个模式,用于处理嵌套
  • * 允许内部任意数量的字符和嵌套
  • s 修饰符让点号也能匹配换行符

如果是提取 JSON 数组,则将大括号换成中括号:

preg_match('/\[(?:[^\[\]]|(?R))*\]/s', $text, $matches);

清洗与解析提取的内容

从文本中提取出的 JSON 字符串可能包含非法字符或不符合标准语法,例如单引号、末尾逗号、未转义字符等。需要进行预处理。

常见修复方法:

  • 将单引号替换为双引号:str_replace("'", '"', $json_str)
  • 去除控制字符:preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_str)
  • 检查是否可被正确解析:
$data = json_decode($raw_json, true);
if (json_last_error() === JSON_ERROR_NONE) {
  // 解析成功
} else {
  // 处理错误
}

注意事项与替代方案

尽管正则可用于提取简单场景下的 JSON,但它不是万能的。复杂嵌套、多段 JSON 或严重格式错误的数据容易导致匹配失败。

建议:

  • 优先尝试用 DOM + XPath字符串定位 配合 json_decode() 使用
  • 对于 JS 混淆数据,考虑使用专门的解析器或模拟执行环境(如 V8Js)
  • 正则仅作为“快速提取”的临时手段,不推荐用于生产级稳定解析

基本上就这些。正则提取 JSON 在小范围调试或日志分析中很实用,但要小心边界情况。掌握递归模式和错误处理,才能更安全地使用这一技巧。

以上就是利用php正则解析JSON数据_通过php正则提取JSON内容的技巧的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号