explode()不能用空字符串作分隔符,否则返回false;拆字符用str_split();含正则元字符用preg_split();中文等多字节字符需用mb_split()或preg_split()避免乱码。

用 explode() 拆字符串最直接,但分隔符为空会返回 false
PHP 里把字符串转成数组,explode() 是第一选择——它快、直观、没副作用。前提是,你明确知道分隔符是什么。
常见错误是传空字符串当分隔符:explode('', 'abc') 不会返回 ['a','b','c'],而是直接返回 false。PHP 明确禁止这么做,不是 bug,是设计限制。
- 想按字符拆,改用
str_split('abc'),它天然支持空分隔场景 - 分隔符含正则含义(比如点号
.、星号*),别硬套explode(),该上preg_split() -
explode()第三个参数$limit控制最多切几段,负数表示忽略末尾若干段,实际中很少用,但调试时能快速截断长字符串
中文或 Unicode 字符串慎用 explode(),优先考虑 mb_split() 或 preg_split()
如果字符串含中文、emoji 或其他多字节字符,explode() 本身不报错,但它按字节切,可能把一个 UTF-8 字符从中间劈开,导致乱码数组元素。
这不是编码设置问题,是函数底层逻辑决定的——explode() 压根不识别字符边界。
立即学习“PHP免费学习笔记(深入)”;
- 分隔符是固定中文词(如
"|"或","),且确定环境已设好mb_internal_encoding('UTF-8'),可用mb_split('/\|/', $str) - 更通用的做法是用
preg_split('/(? 这类带 Unicode 支持的正则,加上 <code>u修饰符(如/\s+/u) - 别依赖
setlocale()来“修复”explode(),它对多字节无感
str_getcsv() 处理带引号/逗号的文本比 explode() 可靠得多
读 CSV 行、解析日志字段、处理用户粘贴的表格数据——只要内容里可能出现逗号、换行、双引号,explode(',', $line) 就会崩。它不理解 CSV 的转义规则。
str_getcsv() 是 PHP 内置的 CSV 解析器,自动处理引号包裹、内部逗号、换行等边界情况。
- 默认以逗号为分隔符,但可传第二个参数指定其他符号,比如
str_getcsv($line, "\t")解析 TSV - 第三个参数是封装符(默认
"),第四个是转义符(默认\),都可按需覆盖 - 注意:它不校验整行格式,遇到明显损坏的 CSV(如引号不配对)会静默出错,建议配合
error_get_last()检查
性能敏感场景下,explode() 和 str_split() 差距极小,别过早优化
有人担心 str_split() 比 explode() 慢,实测百万次调用差异在毫秒级,远小于一次文件读或数据库查询的开销。
真正影响性能的是误用:比如在循环里反复对同一长字符串调用 explode() 却不缓存结果,或者用 preg_split() 去切固定单字符分隔符。
- 纯英文短字符串 + 固定分隔符 → 无脑
explode() - 要按字符拆 →
str_split(),语义清晰,代码意图一目了然 - 涉及正则、Unicode、CSV 规则 → 别省那几行代码,老实用对应函数,后期维护成本低得多
explode() 在测试数据上没问题,上线后遇到用户输入的 emoji 或 Excel 导出的 CSV 就开始丢数据。函数选型得看数据来源,不是看文档例子有多干净。











