应统一换行符再explode:先str_replace(["\r\n","\r"],"\n",$str),再explode("\n",$clean),并trim每行;php_eol不适用于外部输入;大文本优先用file();需ltrim bom。

直接用 explode("\n", $str) 会漏掉 Windows 换行的行
因为 explode() 只认你给的分隔符,"\n" 在 Windows 下实际是 "\r\n",中间那个 \r 会被当作普通字符保留在结果里。比如 "a\r\nb" 用 explode("\n", ...) 拆出来是 ["a\r", "b"],首行末尾多出一个 \r,后续 trim 或比较时容易出错。
推荐统一换行符再 explode():用 str_replace() 预处理
这是最轻量、兼容 PHP 7.3+ 且不依赖正则的方案,性能比 preg_split() 更稳:
- 先执行
$clean = str_replace(["\r\n", "\r"], "\n", $str),把所有换行变体转成\n - 再用
explode("\n", $clean)得到基础数组 - 最后建议加
array_map('trim', $lines)清理每行首尾空白(含可能残留的空格、制表符) - 若需过滤空行,用
array_filter($lines, 'strlen')—— 不要用array_filter($lines),否则值为"0"的有效行会被误删
别用 PHP_EOL 当分隔符来跨平台
PHP_EOL 是当前服务器系统的换行符,不是输入字符串的换行符。比如你在 Linux 服务器上运行代码,PHP_EOL 是 "\n",但用户从 Windows 上传的文本含 "\r\n",直接 explode(PHP_EOL, $str) 依然会漏拆。
它只适合你**自己生成**的字符串,或确定来源与运行环境一致的场景,不适合处理外部输入(如 $_POST['textarea']、文件内容、API 响应)。
大文本(>5MB)或不确定来源时,优先考虑 file() 函数
如果字符串来自本地可读文件(路径已知),file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) 是更优解:
- 它内部自动识别并处理
\r\n、\n、\r所有变体 - 默认去掉每行末尾换行符,且跳过空行(
FILE_SKIP_EMPTY_LINES) - 比手动归一化 +
explode()更少出错,也更省内存(C 层实现)
但注意:file() 只能读文件,不能处理变量里的字符串;超大文件(GB 级)仍可能爆内存,此时得改用流式读取,而非一次性进数组。
真正容易被忽略的是 BOM:如果原始文本带 UTF-8 BOM("\xEF\xBB\xBF"),首行开头会多出三个不可见字节,导致 trim() 无效。预处理前先加一句 $str = ltrim($str, "\xEF\xBB\xBF") 更稳妥。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











