PHP中explode处理前端JSON字符串返回异常结果的问题排查
问题分析与解决方案
问题本质
你看到的字符串里的“空格”并非普通空格(U+0020),而是Unicode特殊空格字符(比如非断空格U+00A0、窄空格U+2009等)。这类字符视觉上和普通空格一致,但编码完全不同,导致explode(' ', $string)无法识别分割。
你的测试结果差异也能印证这点:手动输入的字符串用的是普通空格,所以分割正常;前端传来的字符串用的是特殊Unicode空格,因此返回整个字符串。
先确认空格类型
可以用bin2hex()打印字符串的十六进制编码,明确具体是哪种空格:
$str = "27 609,66 CZK"; // 前端传来的字符串 echo bin2hex($str);
- 普通空格的十六进制是
20 - 非断空格(UTF-8编码)对应
c2a0 - 其他Unicode空格会有各自的十六进制标识,对比即可确定。
三种解决方法
1. 正则匹配所有Unicode空格分割
用preg_split替代explode,正则可以覆盖所有Unicode空格类字符:
// 匹配所有Unicode分隔空格,分割后自动忽略连续空格 $parts = preg_split('/[\p{Zs}]+/u', $str); // 如果允许匹配换行符等空白字符,也可以用更通用的\s $parts = preg_split('/\s+/u', $str);
\p{Zs}是Unicode标准定义的“分隔空格”字符类,u修饰符确保正则按UTF-8解析字符串。
2. 统一替换为普通空格再分割
先把所有特殊空格替换成普通空格,再用explode处理:
// 将所有Unicode空格替换为普通空格 $normalized = preg_replace('/\p{Zs}/u', ' ', $str); // 分割后过滤空元素(避免连续空格产生空字符串) $parts = array_filter(explode(' ', $normalized));
3. 直接用目标空格字符分割
如果已经通过bin2hex确认了具体的空格编码(比如U+00A0对应UTF-8的c2a0),可以直接用该字符分割:
$parts = explode("\xc2\xa0", $str);
内容的提问来源于stack exchange,提问作者Čamo
相关产品推荐
相关产品推荐

