trim只去除字符串首尾空格,不处理中间空格;要去除所有空白需用preg_replace('/\s+/', '', $str)或str_replace(' ', '', $str)。

trim 为什么没去掉中间的空格
trim 只处理字符串首尾,完全不碰中间。这是它最常被误用的地方——看到“去空格”就下意识用 trim,结果发现 "a b" 里的多个空格原封不动。
- 真正要去除所有空白(包括中间),得用
preg_replace:preg_replace('/\s+/', '', $str) - 如果只要去掉普通空格(不含制表符、换行等),用
str_replace更快:str_replace(' ', '', $str) -
trim的第二个参数是可选的“字符列表”,比如trim($str, " \t\n\r\0\x0B")才算完整空白字符集,默认只含空格、\t、\n、\r、\0、\x0B
ltrim 和 rtrim 各自该在什么场景用
它们不是“备用选项”,而是有明确分工的:当你要保留一端内容、只清理另一端时才用。比如处理用户输入的路径拼接、CSV 字段、日志前缀。
-
ltrim常见于清理开头的协议或分隔符:ltrim($url, 'http://')或ltrim($line, '| ') -
rtrim多用于删掉末尾换行或分隔符:rtrim($content, "\n\r")(注意顺序,"\r\n"和"\n\r"是不同组合) - 别用
rtrim($str, '.')去文件后缀——它会把"file..txt"变成"file..tx",因为是从右往左逐个字符匹配,不是按子串删
中文全角空格、不间断空格这些怎么办
trim 默认不处理全角空格( )、不间断空格( 、\u{00A0})、零宽空格(\u{200B})——它们不在默认字符集中,也不在 \s 正则里(除非加 u 修饰符)。
- 手动补全:
trim($str, " \t\n\r\0\x0B\u{00A0}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{3000}") - 更稳妥用正则:
preg_replace('/^[^\S\p{Z}]*|[^\S\p{Z}]*$/u', '', $str)(\p{Z}匹配所有 Unicode 分隔符) - 注意:
mb_trim不是 PHP 内置函数,别直接抄网上不存在的函数名
性能差异大吗?要不要为省几个字符换函数
纯 ASCII 场景下,trim 比 preg_replace 快 3–5 倍;但一旦涉及 Unicode 或复杂模式,正则反而更可控。关键看你的数据特征和错误容忍度。
立即学习“PHP免费学习笔记(深入)”;
- 用户输入清洗:优先
trim+ 显式补充常见 Unicode 空白,避免正则开销 - 批量文本处理(如日志解析):预编译正则(
preg_replace('/\s+/u', ' ', $str))比反复调用trim更稳 - 注意
ltrim/rtrim在处理超长字符串时,如果第二个参数是长字符串(比如 100 个字符),性能会明显下降——PHP 要逐个比对每个字符
真正麻烦的是混合了不可见控制字符(比如 \u{202D} RTL 标记)的字符串,这种光靠 trim 完全无效,必须先识别再清理。别指望一个函数解决所有“看起来像空格”的问题。











