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

PHP字符串拆分失败排查:为何无法按预期分割目标字符串?

问题:拆分拼接的JSON字符串失败

原始PHP字符串如下:

$str = '[{"action": "verify_with_source","created_at": "2023-05-30T01:39:54+05:30","status": "in_progress","type": "license"}] {"address":null,"badge_details":null,"card_serial_no":null,"city":null,"cov_details":[{"category":"NT","cov":"MCWG","issue_date":"2021-03-30"},{"category":"NT","cov":"LMV","issue_date":"2021-03-30"}],"date_of_issue":"2021-03-30","date_of_last_transaction":"2021-03-30","dl_status":"Active","dob":"1996-10-09","face_image":null,"gender":null,"hazardous_valid_till":null,"hill_valid_till":null,"id_number":"DL1234567890","issuing_rto_name":"MY CITY","last_transacted_at":"MY CITY","name":"MY NAME","nt_validity_from":"2021-03-30","nt_validity_to":"2036-10-08","relatives_name":null,"source":"SOURCE","status":"id_found","t_validity_from":null,"t_validity_to":null}'

需求是将其拆分为两部分:

  1. 数组JSON:[{"action": "verify_with_source",..."type": "license"}]
  2. 对象JSON:{"address":null,..."t_validity_to":null}

你的操作步骤

  • 先移除字符串中的[]:
    $raw = str_replace(['[', ']'], '', $raw);
    
  • 尝试三种方式替换"} {"为"}{":
    $str = preg_replace('^/} {/', '}{', $raw);
    
    $str = preg_replace('^/}\s{/', '}{', $raw);
    
    $str = str_replace('} {', '{}', $raw);
    
  • 最后用explode('}{', $str);拆分,结果整个字符串仍在数组第一个元素中,拆分失败。

错误原因分析

  1. 正则表达式语法错误:preg_replace要求正则表达式使用成对的分隔符(比如/),你写的^/} {/是无效格式,正则引擎无法识别,导致替换完全没生效。
  2. 字符串匹配不准确:原始字符串的HTML转义符"会被解析为实际引号,但两个JSON之间的分隔可能不是单纯的} {(比如存在多个空格、制表符等空白字符),单纯用str_replace匹配固定字符组合可能没命中实际分隔符。

正确解决方案

方案1:精准定位分隔点拆分

原始字符串结构是「数组JSON + 空格 + 对象JSON」,直接找到] 的位置拆分即可,无需先移除[]:

// 找到数组结束的位置("] "的索引)
$splitPos = strpos($str, '] ');
if ($splitPos !== false) {
    // 拆分出两部分
    $part1 = substr($str, 0, $splitPos + 1); // 保留闭合的]
    $part2 = substr($str, $splitPos + 2);
    var_dump($part1, $part2);
}

方案2:修复正则替换后拆分

如果坚持先移除[],需要用正则匹配所有空白字符,确保替换生效:

$raw = str_replace(['[', ']'], '', $str);
// 匹配}后面的所有空白字符,替换为}
$processed = preg_replace('/}\s+/', '}', $raw);
// 匹配{前面的所有空白字符,替换为{
$processed = preg_replace('/\s+{/', '{', $processed);
// 拆分后补全缺失的括号
$arr = explode('}{', $processed);
$arr[0] .= '}';
$arr[1] = '{' . $arr[1];
var_dump($arr);

方案3:转为合法JSON数组解析(最稳妥)

把拼接的字符串转换成合法JSON数组,解析后再提取目标内容:

// 将中间的"] {"替换为", ",前后加[]生成合法JSON数组
$validJson = '[' . str_replace('] {', ', ', $str) . ']';
// 解析JSON(先转义HTML实体为实际字符)
$data = json_decode(html_entity_decode($validJson), true);
// 提取两部分并转回JSON字符串
$part1 = json_encode([$data[0]]); // 还原为数组形式的JSON
$part2 = json_encode($data[1]);
var_dump($part1, $part2);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:27:56