PHP preg_split()按换行分割字符串,需过滤空行(无多行跳转)
解决PHP preg_split按换行分割并过滤空行的问题
嘿,我懂你遇到的麻烦了——用preg_split()按换行分割字符串时,总是冒出空数组元素,只想保留有实际内容的行对吧?
为什么你之前的正则不生效?
你用的(\S*)\n|$正则有两个明显问题:
- 它会匹配换行之间的空内容,比如连续换行的场景,而且结尾的
$会强制生成一个空元素; - 它只盯着非空白字符开头的行,没法处理那些全是空格、制表符的“伪空行”。
推荐的靠谱解决方案
这里有几种简单实用的方法,按需挑选:
方法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
相关产品推荐
相关产品推荐

