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}'
需求是将其拆分为两部分:
- 数组JSON:
[{"action": "verify_with_source",..."type": "license"}] - 对象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);拆分,结果整个字符串仍在数组第一个元素中,拆分失败。
错误原因分析
- 正则表达式语法错误:
preg_replace要求正则表达式使用成对的分隔符(比如/),你写的^/} {/是无效格式,正则引擎无法识别,导致替换完全没生效。 - 字符串匹配不准确:原始字符串的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
相关产品推荐
相关产品推荐

