trim() 函数我们已经非常熟悉了,通常用在接受字符串时过滤下空符号或某些特定字符。不过最近有朋友发出的一个情况让我又重回顾下这个函数,其实我们都没有看到它的隐藏用法
函数定义
Trim - (PHP 4, PHP 5, PHP 7, PHP 8)
去除字符串首尾处的空白字符(或者其他字符)
trim(string $string, string $characters = " \n\r\t\v\x00"): string
此函数返回字符串 string 去除首尾空白字符后的结果。如果不指定第二个参数,trim() 将去除这些字符:
" " (ASCII 32 (0x20)),普通空格符。
"\t" (ASCII 9 (0x09)),制表符。
"\n" (ASCII 10 (0x0A)),换行符。
"\r" (ASCII 13 (0x0D)),回车符。
"\0" (ASCII 0 (0x00)),空字节符。
"\v" (ASCII 11 (0x0B)),垂直制表符。
摘自官方手册,以上都很清楚,而重点在参数详解这里有一句
characters:可选参数,过滤字符也可由 characters 参数指定。 一般要列出所有希望过滤的字符,也可以使用 “..” 列出一个字符范围。
后半句的可用“..”列出范围,我想大部分人没有尝试过,没关系我们现在跟着代码走一遍。
代码实例
$words = "123ABC321abc";
1.0 echo trim($words,"abc"); // 123ABC321
这个大家肯定熟悉,不过要说明的一点是第2个参数是字符集合,不是单串字符。所以顺序不重要,我们可以写成以下这样,结果仍然一样。
1.1 echo trim($words,"cab"); // 123ABC321
现在我们尝试手册中说的".."。
2.0 echo trim($words,"a..c"); // 123ABC321
结果仍然一样,那是不是手册所说的意思是一个头尾的字符串?a..c难道是代表 以a开头并以c结尾的范围?我们再重新验证一下。
2.1 echo trim($words,"2..c"); // 123ABC321
结果仍然一样,按照2.0的理解应该是从2开始去除一直到末尾 123ABC3 这个结果才对。那我们再验证下。
2.2 echo trim($words,"1..c");
结果竟然全空了,看起来是1开始到结尾上面理解没错,可是2.1为什么不生效。
带着这个疑问我开始了各种尝试,最终在我看到原版的英文手册有了新发现。
With .. it is possible to specify an incrementing range of characters.
incrementing range : 翻译过来可以是 递增、增量范围,绝不是说的简单的字符范围。
字符有顺序的增减只能是编码值,想到这里就通了。
其实手册说的字符范围不是指明面上的开头结尾,是指两个字符编码值的范围!
2.1.1 echo trim($words,"2..c");
以ascii码重新审视下这个参数,应该是去除字符在 50 与 99 之间的字符,我们看下预想去除的字符串都是什么值。
2..c : 50 49 97 98 99
只有49超出了指定的范围,所以去除操作是中断的。1之后就全在范围里,所以结果是:123ABC321
结尾
这次真的是涨知识了,我们看文档、手册真的不能草草了解就过,不然真遇到某个奇怪的问题再回头来找真的很废时间精力。
说回这个函数,相同的rtrim、ltrim都是一样的原理,如果最近有需要用这些函数的同学要注意点不要用错了。
我想这个特性可能与chr、ord结合起来才会被用到,比如一些工业化服务中要操作不定长的行列标号,那在我们生成时候可以用它来过滤防止下无效字符的产生。