Menu

PHP trim():去除字符串首尾空白

trim($string) 去除字符串两端的空格、制表符和换行;ltrim() 和 rtrim() 只处理一端。学习怎么去除指定字符、全角空格,以及怎么处理数组中的每个值。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

trim($string) 返回去掉开头和末尾空白后的字符串:空格、制表符、换行符、回车符、NUL 字节和垂直制表符。ltrim() 只去除开头的,rtrim() 只去除末尾的。中间的空格会保留。

var_dump() 的输出会显示每个结果的长度,这样就能看出去掉了哪些字符。对大多数表单值来说,trim 是第一步(密码除外,见本页最后):用户输入 ada@example.com 时多打了一个空格,也应该能正常登录。

语法

trim(string $string, string $characters = " \n\r\t\v\0"): string
ltrim(string $string, string $characters = " \n\r\t\v\0"): string
rtrim(string $string, string $characters = " \n\r\t\v\0"): string

trim() 返回一个新字符串,不会改变你传入的变量。

去除指定字符

第二个参数会替换默认列表。列表里的每个字符都会从两端被去除,不论顺序和次数。.. 表示一个范围,所以 'a..z' 表示所有小写字母。

如果还想继续去除普通空白,就把它们也加进列表:trim($s, " \n\r\t\v\0/")。

第二个参数是一组字符,而不是一个字符串

trim() 不会去除一个单词或后缀。它从两端去除你列出的任意字符,直到遇到一个不在列表里的字符为止。想用它去掉文件扩展名的人常常会被这一点坑到:

第一行连开头的 h 也去掉了,因为 h 在字符集合里。要去除固定的前缀或后缀,用 str_starts_with() 或 str_ends_with() 配合 substr();如果这段文本不会出现在其他位置,也可以用 str_replace()。

去除全角空格(日文和中文输入)

日文键盘经常输入表意文字空格  (U+3000),比如在表单里输入的名字前后,中文输入法的全角模式也会产生它。它不在 trim 的默认列表里,而把它写进第二个参数是个陷阱:trim() 按字节处理,这个空格是 3 个字节 E3 80 80,而 E3 同时也是每个平假名和片假名字符的第一个字节,所以以假名开头的名字会丢掉那个字符的第一个字节。改用带 u 修饰符的正则表达式:

\A 和 \z 锚定字符串的开头和结尾。加上 u 修饰符后,\s 能匹配所有 Unicode 空白:ASCII 空白、全角空格,以及从网页复制粘贴时经常带进来的不换行空格(U+00A0)。没有 u 时,\s 只匹配 ASCII 空白,全角空格会留下来。PHP 8.4 为此新增了 mb_trim()、mb_ltrim() 和 mb_rtrim();在 PHP 8.3 及更早的版本中,就用正则表达式。

对数组中的每个值执行 trim

array_map('trim', $array) 处理每个值并保留键。典型的场景是用 explode() 拆分文本框里的逗号分隔列表:

校验表单值之前先 trim

先 trim,再检查是否为空字符串。这样只包含空格的字段会被当作空值拒绝。运行这段代码,在表单里输入一个前后带空格的名字,然后点击 Send:同一个脚本会带着填好的 $_POST 再运行一次。

不要对密码执行 trim:密码末尾的空格也是密码的一部分。

常见问题

PHP 中 trim() 会去除哪些字符?

默认从字符串两端去除:空格、制表符(\t)、换行符(\n)、回车符(\r)、NUL 字节(\0)和垂直制表符(\v)。它从不碰字符串中间的内容。

trim、ltrim 和 rtrim 有什么区别?

trim() 处理两端,ltrim() 只处理开头,rtrim() 只处理末尾。三者都接收同样的可选参数,即要去除的字符列表。

为什么 trim() 去不掉全角空格?

全角空格(U+3000)不在 trim 的默认列表里,而且在 UTF-8 中占 3 个字节。用 preg_replace('/\A\s+|\s+\z/u', '', $s):加上 u 修饰符后,\s 能匹配所有 Unicode 空白,包括 U+3000。PHP 8.4 新增的 mb_trim() 也能去掉它。

PHP 中怎么去掉字符串末尾的逗号?

rtrim($s, ',') 会去掉末尾所有的逗号。如果逗号后面可能还有空格,把空格也加进去:rtrim($s, ', ')。

怎么对数组中的每个值执行 trim?

array_map('trim', $array) 返回一个新数组,每个值都去除了首尾空白,键保持不变。对于嵌套数组,用 array_walk_recursive() 配合引用。

Coddy 编程语言插图

和 Coddy 一起学编程

开始