preg_split 默认丢弃分隔符;要保留需用捕获组并启用 PREG_SPLIT_DELIM_CAPTURE 标志,使分隔符作为独立元素交替出现在结果中,如 'abc123def456ghi' → ['abc','123','def','456','ghi']。

在 PHP 中,preg_split 默认会**丢弃分隔符**。若想保留分隔符,需借助 捕获组(即用括号包裹正则表达式),并启用 PREG_SPLIT_DELIM_CAPTURE 标志。
使用 PREG_SPLIT_DELIM_CAPTURE 保留分隔符
当正则中包含捕获组(())且传入该标志时,分隔符本身也会作为独立元素出现在结果数组中。
- 分隔符必须写在捕获组内,例如
/(\d+)/而不是/\d+/ - 必须显式传入第三个参数
$flags,并包含PREG_SPLIT_DELIM_CAPTURE - 结果数组中,文本块与分隔符交替出现,顺序与原字符串一致
示例:
$str = 'abc123def456ghi';
$parts = preg_split('/(\d+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
// 结果:['abc', '123', 'def', '456', 'ghi']
同时保留分隔符和空项(可选)
如果分隔符连续或出现在开头/结尾,可能产生空字符串。默认情况下 preg_split 会过滤掉空项,如需保留,追加 PREG_SPLIT_NO_EMPTY 的反向操作 —— 即**不启用它**,并确保未设置该标志。
立即学习“PHP免费学习笔记(深入)”;
- 默认行为就是保留空项(除非显式传入
PREG_SPLIT_NO_EMPTY) - 若发现空项缺失,检查是否误加了
PREG_SPLIT_NO_EMPTY - 如需严格保留所有位置(包括开头、结尾、相邻分隔符间的空串),确保只用
PREG_SPLIT_DELIM_CAPTURE
分隔符含特殊字符或需忽略大小写
正则本身支持全部 PCRE 特性,捕获组内可自由写匹配逻辑。
- 匹配英文标点:
/(,|;|\.)$/ - 忽略大小写:
/(hello)/i - 匹配空白符并保留:
/(\s+)/ - 注意转义:如按点号分割且要保留,则用
/(\.)/,而非/./
替代方案:preg_match_all(适合复杂需求)
若需更精细控制(比如区分“分隔符前内容”“分隔符本身”“分隔符后内容”),preg_match_all 更灵活:
- 用
/(.*?)(\d+)(.*?)/类模式配合PREG_SET_ORDER - 能明确拿到每组的完整匹配和子组,适合做结构化解析
- 但要注意贪婪/非贪婪、边界处理,代码略冗长



















