You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP preg_split()按换行分割字符串,需过滤空行(无多行跳转)

解决PHP preg_split按换行分割并过滤空行的问题

嘿,我懂你遇到的麻烦了——用preg_split()按换行分割字符串时,总是冒出空数组元素,只想保留有实际内容的行对吧?

为什么你之前的正则不生效?

你用的(\S*)\n|$正则有两个明显问题:

  1. 它会匹配换行之间的空内容,比如连续换行的场景,而且结尾的$会强制生成一个空元素;
  2. 它只盯着非空白字符开头的行,没法处理那些全是空格、制表符的“伪空行”。

推荐的靠谱解决方案

这里有几种简单实用的方法,按需挑选:

方法1:用PREG_SPLIT_NO_EMPTY标志(最简洁)

这个内置标志会让preg_split()自动丢弃分割后产生的空元素,搭配\R(匹配任何换行符,包括\n、\r\n、\r,兼容性拉满):

$input = "last_name, first_name
bjorge, philip
kardashian, kim
mercury, freddie";

$lines = preg_split('/\R/', $input, -1, PREG_SPLIT_NO_EMPTY);

这样得到的数组完全是你想要的非空行,没有多余的空元素。

方法2:彻底过滤“伪空行”

如果你的输入里存在只有空格/制表符的行(看起来是空行但实际有空白字符),可以用array_filter()配合trim()来精准过滤:

$lines = array_filter(preg_split('/\R/', $input), function($line) {
    // 去掉前后空白后不为空的行才保留
    return trim($line) !== '';
});

这个方法更严谨,能把所有视觉上的“空行”都清理干净。

方法3:用preg_match_all直接抓取非空行

要是不想先分割再过滤,也可以直接用preg_match_all()匹配所有有效行:

preg_match_all('/^\s*\S.*$/m', $input, $matches);
$lines = $matches[0];

正则里的/m是多行模式,^\s*\S.*$表示匹配行开头可以有空白,但必须至少包含一个非空白字符的行。

最终效果

不管用哪种方法,得到的数组都是:

Array
(
    [0] => last_name, first_name
    [1] => bjorge, philip
    [2] => kardashian, kim
    [3] => mercury, freddie
)

完全符合你的预期~

内容的提问来源于stack exchange,提问作者Sourou Cerulean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:12:52