preg_split()是php处理多分隔符的最直接方法,支持正则表达式、合并连续分隔符、过滤空元素、转义元字符、utf-8模式(加u修饰符),性能敏感时可考虑str_replace+explode替代。

用 preg_split() 处理多个分隔符最直接
PHP 没有原生支持“多分隔符”的 explode(),但 preg_split() 就是为此设计的。它接受正则表达式作为分隔逻辑,把多个字符或模式统一写进一个正则里即可。
常见错误是试图用 explode() 套循环、或拼接多个 str_replace() 再 explode(),既低效又容易漏掉边界情况(比如连续分隔符、首尾空白)。
-
preg_split('/[,\s;]+/', $str)可同时按逗号、空白、分号切分,+还能合并连续分隔符(如"a,, b"不会产生空元素) - 加
PREG_SPLIT_NO_EMPTY标志过滤空字符串:preg_split('/[,;\s]+/', $str, -1, PREG_SPLIT_NO_EMPTY) - 如果分隔符本身含正则元字符(如
.、*、?),必须转义:/[,\.\*\?]/
需要保留分隔符?用 preg_match_all() 替代
preg_split() 默认丢弃分隔符。如果要像 str_split() 那样保留分隔符作为独立元素(例如解析简单表达式 "123+456-789"),就得换思路。
此时正则应捕获「内容 + 分隔符」组合,用 preg_match_all() 提取所有匹配项:
preg_match_all('/([^\+\-\*\/]+)([\+\-\*\/])?/', $str, $matches);
// $matches[0] 是完整匹配,$matches[1] 是值,$matches[2] 是后续分隔符
注意:这个写法要求分隔符在值之后;若分隔符可能出现在开头(如 "+123-456"),需额外处理首项符号。
性能敏感场景慎用 preg_split() 简单分隔
如果只是固定几个单字符分隔符(如只切逗号和分号),且数据量极大(GB 级日志行处理),纯 PHP 循环 + strtok() 或多次 str_replace() + explode() 可能更快——正则引擎启动成本不可忽略。
- 简单场景优先用
preg_split():代码清晰、少出错、兼容 Unicode 安全 - 极端性能需求时,可先
str_replace([';', ','], '|', $str)再explode('|', $str),但要注意|不能是原始数据中的合法字符 - 别为了“看起来快”提前优化:99% 的业务场景下,
preg_split()的性能差异可以忽略
中文标点、Unicode 分隔符要加 u 修饰符
遇到中文顿号、全角逗号、破折号等,普通正则会按字节切分,导致乱码或截断。必须加 u 修饰符启用 UTF-8 模式:
preg_split('/[,,;;\s]+/u', $str, -1, PREG_SPLIT_NO_EMPTY)
漏掉 u 修饰符是线上环境最常被忽略的问题之一,尤其当测试数据全是 ASCII,上线后遇到用户输入中文就崩。
另外,\s 在 u 模式下才能正确匹配中文全角空格、不间断空格等,否则只认 ASCII 空格和制表符。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











