必须转义点号为/\\./才能字面匹配,否则/./会匹配任意字符导致错误;纯点分隔优先用explode(),仅需正则逻辑时才用preg_split()。
. 分割时返回空数组或全匹配因为 . 在正则中是元字符,表示“任意单个字符”,不是字面意义的点号。直接写 preg_split('/./', $str) 会导致整个字符串被切得支离破碎,甚至因回溯过多而返回 false 或空结果。
必须对点号进行转义,写成 \.(在 PHP 字符串中需双反斜杠:'/\./'),才能匹配字面上的点。
preg_split('/./', 'a.b.c') → 可能返回 ['', '', '', ''] 或警告preg_split('/\./', 'a.b.c') → 返回 ['a', 'b', 'c']
/.+$/),更要确认是否真想匹配字面点explode('.', $str)?explode() 更快、更安全,适用于纯分隔符场景。但它的限制很明确:只支持固定字符串,不支持正则逻辑。
explode('.', $str)
preg_split,例如:preg_split('/\.(?=\d)/', $str)(只在点后跟数字时切)explode() 对空段不自动过滤,explode('.', 'a..b') 得到 ['a', '', 'b'];而 preg_split('/\./', 'a..b', -1, PREG_SPLIT_NO_EMPTY) 可跳过空项preg_split 的常见陷阱参数漏掉标志位或误设 limit 容易导致行为反直觉。比如默认情况下,连续点号(a..b)会产生空字符串,而多数业务希望忽略它们。
PREG_SPLIT_NO_EMPTY 过滤空项:preg_split('/\./', 'a..b', -1, PREG_SPLIT_NO_EMPTY) → ['a', 'b']
$limit:设为 2 时只切第一处点,剩下整体当最后一个元素,不是“最多切两刀”。 或全角点),\. 不匹配,得改用 /\x{FF0E}/u 或先统一 normalize多数所谓“按点分割”的需求其实来自版本号(1.2.3)、域名(example.com)、IP(192.168.1.1)——这些结构规整,explode() 完全够用。
真正需要 preg_split 的情况极少,典型如:log_line = "2025-01-01 12:34:56.789 INFO ...",想按小数点切出毫秒部分,但又不能影响时间中的冒号或短横线。
preg_split('/(? 
更精准
explode() 没有回溯风险,不会因恶意输入触发 PCRE 警告a\.b.c),那就不是简单分割问题,得先用 stripcslashes() 或正则去转义explode('.', $s) 就解决了,写 preg_split 反而容易把点号忘转义。