最稳的起点是str_replace(["\r\n", "\r", "\n"], '', $str),需按此顺序替换以避免\r\n被拆分残留,它比trim()、preg_replace('/\s+/', '', $str)或仅用php_eol更可靠且不误删空格。

str_replace(["\r\n", "\r", "\n"], '', $str) 是最稳的起点
PHP 7.1 不支持 \R(Unicode 换行符匹配),也不推荐用 preg_replace('/\s+/', '', $str) 这类宽泛正则——它会误杀空格、制表符,甚至把用户有意保留的多个空格也干掉。直接批量替换三类换行符,简单、无歧义、性能好。
实操建议:
- 必须按
["\r\n", "\r", "\n"]顺序传入数组:先处理\r\n,再单独处理\r和\n,否则\r\n被拆开两次替换,可能残留\r或\n - 别写成嵌套调用:
str_replace("\n", '', str_replace("\r", '', $str))—— 它漏掉\r\n组合,且多一次函数调用 - 如果字符串来自
textarea或文件读取,大概率混着不同系统的换行,这个数组方式比只用PHP_EOL更可靠
trim() 只能清首尾,对行末换行符完全无效
很多人看到“去除换行”第一反应是 trim($str),但它只动开头和结尾的空白字符,对中间每个 \n、\r\n 都视而不见。比如 "line1\r\nline2\nline3" 经 trim() 后仍是原样,只是首尾没空格了。
常见错误现象:
- 用
trim()处理多行文本后,json_encode()报错:因为 JSON 不允许字符串里有裸\n - 存进数据库字段后,前端渲染时出现意外折行或
实体 - 拼 SQL 时换行被当成语法错误(尤其在动态构建 WHERE 条件时)
要保留空格只删换行?用 preg_replace('/[\r\n]+/', ' ', $str)
当目标不是“彻底删除”,而是“把换行转成空格”(比如把多行地址压成一行),就得换正则。注意这里用的是字符组 [\r\n],不是 \s —— 后者会吃掉制表符和普通空格,容易破坏格式。
实操建议:
- 加
+是为了合并连续换行,避免变成多个空格;之后补一句trim()清首尾空格更干净 - 不用
/u修饰符也够用:PHP 7.1 的 PCRE 默认支持 UTF-8,\r和\n本身是 ASCII,不涉及编码歧义 - 别用
preg_replace('/\s/', ' ', $str)—— 它会把原文里的\t、全角空格、甚至中文顿号前后的空格全换成英文空格
从文件或 textarea 读入时,换行符来源比想象中杂
用户在 Windows 上用 Chrome 提交 textarea,可能发来 \r\n;用 iOS Safari 可能只发 \n;老版本编辑器或邮件客户端甚至塞进 \r 单独存在。文件读取时,若用 fgets() 或 file(),每行末尾自带换行,但内容里还可能嵌着别的换行。
所以真正健壮的做法是:
- 先做一次
str_replace(["\r\n", "\r", "\n"], '', $str)彻底清空 - 如果后续还要按行处理,改用
explode(PHP_EOL, $str)分割,再对每行trim()—— 这样既分得准,又不会漏掉某行末尾的残留 - 别依赖
PHP_EOL做全局替换:它只代表当前服务器系统换行符,对客户端提交的混合换行无效
str_replace 数组方案看起来土,但在 PHP 7.1 下最不容易翻车。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











