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

str_replace(['\\@'], ['\x00'], $str) 临时替换,分割完再 str_replace("\x00", '@', $part)
\\@ 表示字面量 \@),就得用 preg_replace_callback() 手动解析转义序列preg_split() 里 @ 要不要转义?看上下文在正则表达式中,@ 本身不是元字符,不强制转义。但如果你用 @ 做分隔符定界符(比如 preg_split('@pattern@', $str)),那 pattern 里的 @ 就必须转义,否则正则引擎提前终止。
/ 作定界符,避免混淆:preg_split('/@/', $str)
@ 定界,且 pattern 里含 @,必须写成 preg_split('@\@|other@', $str)
preg_split() 第三个参数 $limit 设为 -1 才等价于 explode() 的“不限次数”,设为 0 会被当成 1
在 10 万次基准测试下,explode() 比 preg_split() 快 3–5 倍,内存占用低一半以上。这不是理论值,是实际压测结果。
真正该用正则的场景只有两个:需要按多种分隔符切(如 @、|、; 混用),或要保留分隔符本身(用 PREG_SPLIT_DELIM_CAPTURE)。其他情况都属于过早优化。
最容易被忽略的是:很多所谓“含特殊字符”的文本,其实是结构化数据(如邮箱、URL),本就不该用简单分割处理——这时候该用 filter_var($str, FILTER_VALIDATE_EMAIL) 或 parse_url(),而不是纠结怎么切 @。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...