1. 基本概念
在现实中的很多情况下,我们都需要先清除一个字符串左右两边的空白字符,然后再使用它。比如我们要求用户在网页中的一个输入框中输入他的手机号,当用户输入的字符串被提交到服务端后,我们需要验证它是否符合正确的手机号格式。但是用户可能在手机号的左边或右边不小心输入了空格;为了更好的用户体验,我们在服务端先自动清除该字符串左右两边的空格再进行格式匹配,而不是直接告诉用户他的输入是错误的。
php已经为我们提供了实现这一功能的函数,那就是trim()函数。英文单词trim有“修剪、切除”的意思,在这里要表达的就是在字符串的左右两边进行删除。trim()函数不但能删除空白符,还可以删除其它任意字符,只要你在它的第二个参数中指明了你想要删除的那些字符即可。
还有两个和trim()函数很相近的函数,ltrim()和rtrim()。ltrim第一个字母l表示left,即它只删除字符串左边的空白符或其它字符。rtrim的第一个字母r表示right,即它只删除字符串右边的空白符或其它字符。调用trim()等于同时调用ltrim()和rtrim()。
2. 语法
2.1 函数原型
这三个函数的原型如下所示:
2.2 参数
其中$str是待处理的字符串,而$char_mask则指明你想要删除哪些字符。$char_mask是一个可选的参数,当它被省略的时候,这3个函数都默认删除以下这些空白符:
" ",空格符(ASCII码32);
"\t",制表符(ASCII码9);
"\n",换行符(ASCII码10);
"\r",回车符(ASCII码13);
"\0",空字符(ASCII码0);
"\\x0B",垂直制表符(ASCII码11)。
在$char_mask参数中,还可以使用..来指定一个字符范围。比如我想要删除a至z的所有字符,那么可以将$char_mask指定为"a..z",而不用将a至z的每一个字符都书写一遍。
当用..指定一个字符范围的时候,开始字符一定不能大于结束字符,否则实际指定的是开始字符、英文句点和结束字符这3个字符,而不是一个字符范围。此外,这种情况还会产生一条E_WARNING级别的错误消息。
2.3 返回值
这3个函数都返回一个新的字符串,它等价于在参数$str的左边或右边删除指定字符后的结果,而原本的参数$str则不变。
2.4 算法原理
这3个函数并不是只删除某一边的一个字符,如果字符串最左边或最右边的多个字符都是待删除字符,那么它们都会被删去。trim()函数的算法原理等价于下面的步骤:
首先,trim()函数从$str的第1个字符向右搜索,直到遇到第1个不是待删除字符的字符为止;此时,它得到一个只包含待删除字符的最左子串。
然后,trim()函数再从$str的最后一个字符起向左搜索,直到遇到第1个不是待删除字符的字符为止;此时,它得到一个只包含待删除字符的最右子串。
新建一个字符串,它等于在$str上删除前两个步骤中的最左子串和最右子串后的剩余内容;返回该字符串。
ltrim()和rtrim()函数的原理与此类似,只是它们只在字符串的一边而不是两边进行删除。
3. 示例
3.1 省略$char_mask参数
以上代码的执行结果如图1所示,可以看到$str左右两边的空白符都被删除了,但中间的空白符没有被删除。trim()函数执行之后,$str并不会被改变,因为函数用一个新字符串返回了在$str两边删除空白符的结果。
图1 省略$char_mask参数的情况
3.2 使用$char_mask参数
我们首先使用$char_mask参数来指明我们想删除其它的字符而非空白符,然后再通过字符范围的方式来等价地指定这些字符。
该示例的执行结果如图2所示,可以看到紧挨着待删除字符的空白符现在没有被删除,因为此时空白符已不再属于要删除的字符。此外"a..k"等价于"abcdefghijk",且字符范围还可以和直接指明待删除字符的方式混合使用,比如"a..gkijh"其实也等价于"abcdefghijk"。
图2 用$char_mask参数指定要删除的字符
我们再来测试一下当指明字符范围的时候开始字符大于结束字符的情况,下面代码的执行结果如图3所示。可以看到有一条错误消息指明我们在第10行代码中所指定的字符范围是错误的;其次"d..a"相当于指定的删除字符是d、.(英文句点)和a这3个,而非一个字符范围。
图3 错误的字符范围指定方式的结果
3.3 ltrim()和rtrim()
以上代码的执行结果如图4所示,可以看到ltrim()和rtrim()只是在字符串的左边或右边进行删除。
图4 ltrim()和rtrim()的效果
(完)
领取专属 10元无门槛券
私享最新 技术干货