trim()仅处理字符串首尾,默认字符集不含全角空格、零宽字符及BOM;非字符串类型会抛TypeError;清洗中间空白需preg_replace('/\s+/u', ' ', $str),首尾校验优先用trim()。

trim() 只动首尾,且只认默认空白字符
trim() 的行为非常明确:它只处理字符串开头和结尾,对中间的空格、制表符、换行符完全无视。它默认清理的字符集是 " \t\n\r\0\x0B"(含空格、制表符、换行、回车、空字节、垂直制表符),不包括中文全角空格 \u{3000},也不包括零宽字符(如 \xE2\x80\x8B)或 BOM(\xEF\xBB\xBF)。
传入非字符串类型(比如 null 或数组)会触发 TypeError(PHP 8.1+),不是静默转成空字符串。
常见错误现象:
- 用
trim()处理用户粘贴进来的富文本,结果段落间多个换行还在 → 因为它不碰中间 - 处理含全角空格的中文输入,发现去不掉 → 默认字符集不含
\u{3000} - 上传 CSV 后字段首尾看似“干净”,但
var_dump()看到开头有\xEF\xBB\xBF→ BOM 没被trim()清掉
preg_replace('/\s+/', ...) 能控全局,但得小心语义和编码
preg_replace('/\s+/', '', $str) 会把所有 Unicode “空白类”字符(包括 \t、\n、\r、\u{3000}、\u{2000}–\u{200A} 等)全部干掉;而 preg_replace('/\s+/', ' ', $str) 是压缩成单个空格 —— 这才是清洗用户输入更合理的做法。
立即学习“PHP免费学习笔记(深入)”;
但要注意:
-
/\s/在 PCRE 中默认不匹配 UTF-8 全角空格,除非启用u修饰符:preg_replace('/\s+/u', ' ', $str) - 正则性能比
trim()低,尤其大文本反复调用时明显 - 如果只是想删掉换行符,
str_replace(["\r", "\n"], '', $str)比正则更快更直白 - 遇到零宽字符(如
\xE2\x80\x8B)或 BOM,/\s/也匹配不到,得单独str_replace()
什么时候该用 trim(),什么时候该上正则
看目标位置和粒度:
- 表单字段「收尾校验」→ 无条件用
trim(),快、安全、语义清晰 - 导出 CSV 前统一字段格式 → 先
trim()首尾,再preg_replace('/\s+/u', ' ', $str)压缩中间空白 - 清洗富文本纯文本内容(如摘要提取)→ 必须用
preg_replace()或组合str_replace()清零宽/BOM/全角空格 - 处理日志行或配置值,只要去掉换行 → 直接
str_replace(["\r\n", "\n", "\r"], '', $str),别绕路正则
容易被忽略的边界情况
真正上线后踩坑的,往往不是主流程,而是这些细节:
- 数据库读出来的字段可能是
null,直接喂给trim()会报错 → 先判is_string($s) - 前端富文本编辑器插入的「不可见字符」(如
\u{FEFF}、\u{2060})既不在\s里,也不在trim()默认集里 → 得靠str_replace()显式列出来 - 用
preg_replace('/\s+/', ' ', $str)后,可能多出首尾空格 → 最后还得套一层trim() - 数组批量处理时,
array_map('trim', $arr)更安全,比引用循环少一个unset()忘写的隐患
复杂点从来不在函数选哪个,而在你是否清楚当前字符串到底混进了什么字符。



















