trim() 默认仅删除ASCII空白字符,对全角空格、Unicode空格、BOM等无效;需用第二个参数显式指定字符集,且必须按字节书写,不能用正则或Unicode码点。

trim() 默认就删首尾空格、制表符、换行符、回车符、NUL 字节和垂直制表符,不用额外配置就能应付大多数用户输入清洗场景。
为什么 trim() 有时没效果?
常见现象:调用 trim($str) 后字符串看起来没变,比如 "hello " 还是带空格。
- 实际可能是字符串里混了全角空格(
)、Unicode 不间断空格(或\u00A0)、零宽空格(\u200B)——这些都不在默认字符列表里,trim()完全忽略 - 也可能是字符串末尾有 HTML 实体或 BOM 头(如
\xEF\xBB\xBF),默认也不处理 - 注意:
trim()不修改原变量,必须赋值接收结果:$clean = trim($str);
trim() 的第二个参数怎么写才安全?
这个参数不是正则,也不是通配符,而是「字符集合」——每个字符单独列出,顺序无关,重复无效。
- 正确写法:
trim($str, " \t\n\r\0\x0B\xa0")(加了\xa0处理不换行空格) - 范围写法可用:
trim($str, "a..zA..Z0..9")表示所有大小写字母和数字,但注意两端必须是合法 ASCII 字符,否则会警告甚至报错 - 错误写法:
trim($str, "*")想删星号是对的,但写成"*.*"或"*.+"就会误触发范围解析,PHP 把.*当作 “从.到*的字符范围”,而这两个 ASCII 值不递增,直接报 Warning - 空字符串
""传给第二个参数会出错,不能省略就写空引号
什么时候不该用 trim()?
它只处理首尾连续出现的字符,中间的完全不动。如果目标是清理整个字符串里的所有空白,或者要兼容 UTF-8 BOM、Unicode 空格、富文本残留符号,就得换方案。
- 批量清理数组元素?用
array_map('trim', $arr)可以,但注意 PHP 8.1+ 支持array_map(fn($v) => trim($v), $arr)更灵活 - 要删 BOM?
trim($str, "\xEF\xBB\xBF")可以,但更稳妥是先检测再剥:0 === strncmp($str, "\xEF\xBB\xBF", 3) && $str = substr($str, 3); - 要处理中文标点包裹?比如
"【用户名】",别硬套trim($str, "【】")——万一用户真叫“【张三】”,首尾恰好匹配就误删了;这种情况更适合preg_replace('/^【(.+)】$/', '$1', $str)
trim() 的行为完全依赖字节流。比如 UTF-8 下的中文字符是多字节,你传入的 $character_mask 必须按字节拼,不能按 Unicode 码点想当然地写 \u4F60 ——那会当普通字符串处理,根本不起作用。



















