最可靠的方式是用 str_replace 或 preg_replace 显式替换所有换行符;trim 只去首尾,无法处理字符串中间的 \r\n、\r、\n。

PHP 删除字符串换行符,最可靠的方式是用 str_replace 或 preg_replace 显式替换所有可能的换行组合,而不是依赖 trim —— 它只去首尾,中间的 \n、\r\n 全留着。
为什么 trim 不够用
很多人第一反应是 trim($str),但它只清除字符串开头和结尾的空白字符(包括 \n、\r、\t 等),对中间的换行完全没影响。
常见错误现象:
输入 "hello\r\nworld\nagain",用 trim 后还是 "hello\r\nworld\nagain",只是首尾空格没了。
-
trim不处理字符串内部的换行 - Windows 下换行是
\r\n,Linux/macOS 是\n,旧 Mac 是\r——trim虽能识别它们,但仅限两端 - 如果目标是“把所有换行替换成空格”或“彻底删掉”,
trim直接失效
str_replace 批量干掉所有换行(推荐日常用)
简单、快、无正则开销,适合确定只需删除(而非替换为其他字符)的场景。
立即学习“PHP免费学习笔记(深入)”;
实操建议:
- 一次性替换全部常见换行符:
str_replace(["\r\n", "\r", "\n"], '', $str) - 顺序很重要:必须先换
\r\n,再换\r和\n,否则\r\n会被拆成两次替换,可能残留\r或\n - 不要写成
str_replace("\n", '', str_replace("\r", '', $str))—— 这漏掉了\r\n组合,且效率低
示例:$clean = str_replace(["\r\n", "\r", "\n"], '', "line1\r\nline2\nline3\r"); // → "line1line2line3"
preg_replace 处理复杂需求(比如换为空格、保留段落)
当你要的不是“全删”,而是“换行变空格”“合并连续空白”“只删 Windows 换行”时,正则更灵活。
实操建议:
- 统一转空格:
preg_replace('/\r\n|\r|\n/', ' ', $str) - 删所有空白符(含换行、制表、多余空格):
preg_replace('/\s+/', ' ', $str),再trim一下 - 注意 PCRE 默认不支持
/u时对 UTF-8 换行的兼容性;若字符串含中文等,加u修饰符更稳:preg_replace('/\r\n|\r|\n/u', '', $str) - 性能比
str_replace略低,但差异在微秒级,一般可忽略
别忘了来源和编码问题
换行符“看不见”,但它的存在常被忽略——尤其从表单 textarea、文件读取、数据库字段来的内容,很可能混着不同系统的换行。
容易踩的坑:
- 用
file_get_contents读文本时,Windows 文件自带\r\n,直接 echo 可能看不出,但存进数据库或做 JSON 输出就出问题 - MySQL 的
TEXT字段存了\r\n,PHP 取出来后不做处理,前端显示就是断行 —— 别怪浏览器,先查 PHP 层有没有清理 - JSON 接口返回含未处理换行的字符串,某些客户端解析会失败(尤其老安卓 WebView)
真正麻烦的从来不是“怎么删”,而是“你根本没意识到它还在那儿”。











