PHP中空分隔符不支持explode(),应按场景选函数:固定分隔符用explode(),正则用preg_split()加PREG_SPLIT_NO_EMPTY,逐字符UTF-8安全拆分用mb_str_split()(7.4+)或mb_substr()循环,JSON必须用json_decode()并检查编码与错误。

用 explode() 拆字符串,但分隔符为空时会出错
直接传空字符串 '' 给 explode() 会报 Warning:「Empty delimiter」,PHP 不允许。这不是 bug,是设计限制——它只处理「有明确边界」的分割,不支持逐字符拆解。
常见错误现象:explode('', 'abc') 导致脚本中断或返回 false;有人误用 str_split() 却没意识到它对多字节字符(如中文、emoji)可能切错位。
- 要按固定字符拆(比如逗号、竖线),就用
explode(),它最快、最轻量 - 要按正则规则拆(比如多个空格、混合符号),改用
preg_split() - 要逐字符拆且确保 UTF-8 安全(含中文、emoji),必须用
mb_str_split()(PHP 7.4+)或手动mb_substr()循环
preg_split() 怎么避免空元素和分隔符残留
正则分割灵活,但默认会把匹配到的分隔符本身吃掉,而且容易在开头/结尾/连续分隔符处留下空字符串 '',这常导致后续 array_filter() 补救,反而增加开销。
使用场景:日志行解析("2024-03-15|INFO|User login")、CSV 风格但含不规则空格的字段提取。
立即学习“PHP免费学习笔记(深入)”;
- 加标志
PREG_SPLIT_NO_EMPTY直接过滤空项,比事后array_filter()更干净 - 若需保留分隔符(比如想同时拿到字段和分隔符号),加
PREG_SPLIT_DELIM_CAPTURE,结果数组会交错出现内容和分隔符 - 注意 PCRE 引擎对 Unicode 的支持:PHP 7.3+ 默认启用
u修饰符更稳,写成/\s+/u而不是/\s+/
str_split() 和 mb_str_split() 别混用
str_split() 是单字节函数,遇到 UTF-8 中文会把一个汉字切成两三个乱码字节;mb_str_split() 才真正按字符切,但它只在 PHP 7.4+ 可用,低版本得自己封装。
性能影响明显:mb_str_split() 比 str_split() 慢 3–5 倍(因要查 UTF-8 编码边界),但错不得——一旦字符串含中文、日文或 emoji,前者结果完全不可用。
- 确认 PHP 版本:用
PHP_VERSION_ID >= 70400判断是否可用mb_str_split() - 低版本兼容写法:用
mb_strlen()获取长度,再循环mb_substr($str, $i, 1, 'UTF-8') - 别用
preg_split('//u', $str)模拟逐字符拆——它会在首尾各插一个空字符串,还得array_shift()和array_pop()去掉
JSON 字符串转数组?别用 explode() 或正则硬拆
看到 '{"a":1,"b":2}' 就想用字符串函数拆,这是典型误区。JSON 结构嵌套、引号转义、空格可变,正则根本不可靠,explode() 更是直接失效。
唯一正确路径是 json_decode(),但要注意两个关键点:
- 必须检查返回值是否为
null,且调用json_last_error()—— 多数失败不是因为格式错,而是编码不是 UTF-8(比如 GBK 文件读入) - 默认返回对象,要数组得传第二个参数
true:json_decode($json, true) - 如果 JSON 来自不可信输入(如用户 POST),记得设最大深度和大数处理选项,避免栈溢出或精度丢失
mb_* 系列函数默认用 UTF-8,但文件读取、数据库连接、HTTP 请求头可能不是。字符串一进一出,编码不对,mb_str_split() 和 json_decode() 都会静默失败。











