直接用 explode('@', $str) 即可,安全、快速、易读;若含转义@(如@),需先替换再分割,preg_split 无法原生识别转义语义。

PHP 中用 @ 分割字符串,直接用 explode() 就够了
除非字符串里有转义的 @(比如 @),否则完全不需要上正则。很多人一看到“特殊符号”就条件反射写 preg_split(),反而引入不必要的复杂度和性能开销。
常见错误是把简单问题搞复杂:比如写 preg_split('/@/', $str) 处理纯文本,结果遇到 @ 在邮箱里、路径里、注释里,还开始纠结分隔符边界——其实根本没这个必要。
-
explode('@', $str)是最安全、最快、最易读的方案 - 如果源数据明确不含转义逻辑,连
str_getcsv()或strtok()都不用考虑 - 注意:
explode()对空段不自动过滤,需要时加array_filter($parts)
真要处理转义的 @,得先清理再分割
PHP 没有内置“带转义支持的分割”函数,preg_split() 本身也不识别 @ 这种转义语义——它只认正则语法,@ 在正则里就是字面量 @,不是“被转义的 @”。
所以必须分两步:先替换掉被反斜杠转义的 @(比如换成临时标记),再按 @ 切,最后还原。不能指望一个正则一步到位。
立即学习“PHP免费学习笔记(深入)”;
- 错误写法:
preg_split('/(? —— 看似想匹配“前面不是反斜杠的 <code>@”,但 PCRE 不支持变长负向回溯((?<!\\)实际会报错或行为异常) - 可行做法:用
str_replace(['\@'], [' '], $str)临时替换,分割完再str_replace("
