最常用方案是explode()后用array_filter()去空,需注意'0'被误删;复杂分隔用preg_split()加PREG_SPLIT_NO_EMPTY;换行处理要先统一\r\n、\r、\n;str_getcsv()适合标准CSV但不支持正则分隔符。

用 explode() 分割后直接过滤空字符串
PHP 中最常见场景是用 explode() 拆分字符串(比如按逗号、换行或空格),但结果数组里常混入空元素,尤其是首尾有分隔符、连续分隔符或纯空白行时。explode() 本身不提供去空选项,必须后续处理。
推荐组合:先 explode(),再用 array_filter() 去掉空值。默认情况下,array_filter() 会过滤掉所有“falsy”值(包括 ''、0、false、null),这在多数文本分割场景下刚好合适——但要注意它也会误删 '0' 这类合法字符串。
- 如果确定数据不含数字字符串
'0'或布尔字符串,直接用array_filter($arr) - 若需保留
'0'、'false'等非空字符串,显式传入回调:array_filter($arr, 'strlen')或array_filter($arr, function($v) { return $v !== ''; }) - 别忘了用
array_values()重置键名,否则索引可能不连续(如[0=>'a', 2=>'b'])
用 preg_split() 一步跳过空片段
当分隔符不固定(比如多个空格、混合制表符和换行),或者想从源头避免空元素,preg_split() 比 explode() 更灵活。它支持正则,并可通过 PREG_SPLIT_NO_EMPTY 标志自动丢弃空项。
- 简单空格/空白分割:
preg_split('/\s+/', $text, -1, PREG_SPLIT_NO_EMPTY) - 按逗号且忽略前后空白和空字段:
preg_split('/\s*,\s*/', $text, -1, PREG_SPLIT_NO_EMPTY) - 注意:默认模式下
preg_split()不会过滤空,必须显式加PREG_SPLIT_NO_EMPTY标志 - 性能上比
explode() + array_filter()略低,但逻辑更干净,尤其适合复杂分隔场景
处理换行符时的隐藏坑:Windows 和 Mac 的 \r
用 explode("\n", $text) 处理用户输入或文件内容时,容易漏掉 \r(回车)。Windows 是 \r\n,旧 Mac 是 \r,Linux 是 \n。直接按 \n 切,\r 可能残留在元素末尾,导致看似“空”的元素实际是 "\r",array_filter() 不会删它。
立即学习“PHP免费学习笔记(深入)”;
- 稳妥做法:先统一换行符,例如
$text = str_replace(["\r\n", "\r"], "\n", $text),再explode("\n", ...) - 或直接用
preg_split('/\r\n|\r|\n/', $text, -1, PREG_SPLIT_NO_EMPTY) - 验证是否残留:打印
var_dump($arr),看元素末尾是否有\r(显示为"abc\r")
为什么不用 str_getcsv()?它其实也过滤空
如果分隔符是英文逗号、分号或制表符,且字段可能带引号或转义,str_getcsv() 是更语义化的选择。它默认解析 CSV 规则,并**自动跳过空行和全空白字段**,但注意它不会把连续分隔符视为空字段(CSV 标准中 ,, 表示一个空字段,str_getcsv() 会保留 '')。
- 对标准 CSV 输入,它比手写正则更可靠,比如处理
"a,\"b,c\",d" - 但它不接受任意正则分隔符,仅支持单字符分隔符(
$delimiter参数) - 空字段仍存在,所以仍需
array_filter($arr, 'strlen')来真正剔除
'0' 字符串的误删——前者导致空元素“看不见”,后者让数据莫名丢失。选函数不难,关键是根据输入来源决定清洗策略。











