mb_trim() 默认能清掉所有 unicode 类别为 zs(space separator)的空格字符,以及 ascii 空格、制表符、换行等控制字符。它基于 php 的 `mbstring` 扩展,使用 icu 库进行判断,因此支持 utf-8 编码下的全角空格、半角空格、不换行空格等多种空白符。

mb_trim() 具体清除了哪些 Unicode 空格?
在 PHP 8.4 中,mb_trim() 默认会移除字符串首尾的所有“空白”字符。这里的“空白”不仅包括常见的 ASCII 空格(U+0020)、水平制表符(U+0009)、换行符(U+000A、U+000D),还包括所有 Unicode 标准中定义为 Zs(Space Separator)类别的字符。这意味着全角空格(U+3000)、半角无宽空格(U+2002 到 U+200A)、不换行空格(U+00A0)等都会被清除。

<?php // 测试 mb_trim() 对多种 Unicode 空格的清理能力
$test_string = "\u{0020}Hello World\u{3000}"; // 普通空格 + 中文内容 + 全角空格
$trimmed = mb_trim($test_string);
echo bin2hex($trimmed) . "\n";
$test_string2 = "\u{00A0}Test\u{2003}"; // 不换行空格 + 内容 + _em空格_
$trimmed2 = mb_trim($test_string2);
echo bin2hex($trimmed2) . "\n";
// 输出示例:
// 48656c6c6f20576f726c64 (Hello World)
// 54657374 (Test)
上述代码展示了 mb_trim() 如何处理不同 Unicode 空格。第一个例子中,前导的普通空格和尾部的全角空格都被移除,只保留中间的文本。第二个例子中,前导的不换行空格(U+00A0)和尾部的 _em空格_(U+2003)也被成功清除。这表明 mb_trim() 能够识别并移除这些非 ASCII 的空白字符。
与 trim() 相比,mb_trim() 在处理多字节字符时有哪些优势?
trim() 是 PHP 的内建函数,仅处理 ASCII 字符集中的空白符,无法正确识别和处理多字节编码中的空白字符。而 mb_trim() 基于 mbstring 扩展,能够正确处理 UTF-8 等多字节编码,确保在多语言环境下正确清理字符串首尾的空白。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。

<?php // 对比 trim() 和 mb_trim()
$test_string = "\u{3000}Hello\u{3000}"; // 全角空格包围的文本
$trimmed_ascii = trim($test_string);
echo bin2hex($trimmed_ascii) . "\n"; // 输出: e3808048656c6c6fe38080 (未清理全角空格)
$trimmed_mb = mb_trim($test_string);
echo bin2hex($trimmed_mb) . "\n"; // 输出: 48656c6c6f (已清理全角空格)
通过对比可以看出,trim() 无法识别全角空格(U+3000),因此原样返回。而 mb_trim() 则能正确识别并移除这些多字节空白字符,确保字符串的纯净性。这对于处理包含多语言内容的字符串尤为重要。
如果输入字符串中包含不可见字符,mb_trim() 会如何处理?
mb_trim() 只会移除字符串首尾的空白字符,不会处理字符串内部的不可见字符。如果字符串内部包含不可见字符,如零宽空格(U+200B)或零宽连字符(U+200D),mb_trim() 不会将其移除。如果需要清理字符串内部的不可见字符,需要使用其他方法,如正则表达式替换。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










