最直接的方法是先用str_replace()统一换行符为"\n",再explode("\n", $text)并array_filter($segments, 'strlen')过滤空段后count();也可用preg_split('/\r\n|\r|\n/', $text, -1, PREG_SPLIT_NO_EMPTY)更鲁棒处理混合换行和空段。

用 explode() 分割文本再 count() 统计段数最直接
PHP 里统计“段数”,本质是按某个分隔符把字符串切开,然后数切出来多少块。最常用、最稳妥的方式就是 explode() 配合 count()。注意:段落通常以换行符("\n")为界,但 Windows 的 "\r\n" 和 Mac 的 "\r" 也可能存在,不能只认一种。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 统一用
str_replace()先把所有换行变一种(比如全转成"\n"),再explode("\n", $text) - 过滤空段:分割后可能产生首尾或连续换行导致的空字符串,用
array_filter($segments, 'strlen')剔除 - 别直接
count(explode("\n", $text))—— 如果原文末尾有换行,会多出一个空段
用 preg_split() 更鲁棒地处理混合换行和空白段
当文本来源不可控(比如用户粘贴、跨平台导入),光靠 explode() 容易漏掉 "\r\n" 或误判空段。preg_split() 可以一条正则覆盖所有换行变体,并支持直接丢弃空项。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 写法:
preg_split('/\r\n|\r|\n/', $text, -1, PREG_SPLIT_NO_EMPTY) -
PREG_SPLIT_NO_EMPTY参数比手动array_filter()更省事,也避免因空白字符(如纯空格段)被误保留 - 如果段落之间可能有多个空行,想合并为单一分隔,可用
'/[\r\n]+/'代替
注意 file() 和 file_get_contents() 的适用场景差异
如果你的文本来自文件,别急着读进来再分割。PHP 提供了更高效的原生方式:
-
file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)直接返回去除了换行符和空行的数组,count()即段数 - 它底层用 C 实现,比先
file_get_contents()再正则分割快得多,内存占用也低 - 但仅适用于本地文件;如果文本已存在变量中,就别绕路写临时文件再读
小心 UTF-8 BOM 和不可见控制字符干扰段数统计
有些编辑器(尤其 Windows 下的记事本)保存 UTF-8 文件时会加 BOM("\xEF\xBB\xBF"),它紧贴第一个字符前,会导致第一段开头多出乱码,甚至让 preg_split() 切错位置。另外,"\0"、零宽空格等控制字符也可能破坏分割逻辑。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
mb_detect_encoding($text, ['UTF-8', 'ASCII'], true)确认编码,再用mb_substr($text, 0, 3) === "\xEF\xBB\xBF"检查 BOM - 发现 BOM 就用
ltrim($text, "\xEF\xBB\xBF")去掉 - 对可信度低的输入,可先
preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $text)清理控制字符
段数统计看着简单,但实际落地时,换行兼容性、空段处理、BOM 干扰这三点最容易出偏差,尤其是从不同系统或编辑器来的文本。别假设输入“干净”。











