1. 基本观点
在现实中的很多情形下,我们都须要先打消一个字符串旁边两边的空缺字符,然后再利用它。比如我们哀求用户在网页中的一个输入框中输入他的手机号,当用户输入的字符串被提交到做事端后,我们须要验证它是否符合精确的手机号格式。但是用户可能在手机号的左边或右边欠妥心输入了空格;为了更好的用户体验,我们在做事端先自动打消该字符串旁边两边的空格再进行格式匹配,而不是直接见告用户他的输入是缺点的。
php已经为我们供应了实现这一功能的函数,那便是trim()函数。英文单词trim有“修剪、切除”的意思,在这里要表达的便是在字符串的旁边两边进行删除。trim()函数不但能删除空缺符,还可以删除其它任意字符,只要你在它的第二个参数中指明了你想要删除的那些字符即可。
还有两个和trim()函数很附近的函数,ltrim()和rtrim()。ltrim第一个字母l表示left,即它只删除字符串左边的空缺符或其它字符。rtrim的第一个字母r表示right,即它只删除字符串右边的空缺符或其它字符。调用trim()即是同时调用ltrim()和rtrim()。
2. 语法2.1 函数原型
这三个函数的原型如下所示:
string trim(string $str, string $char_mask=" \t\n\r\0\x0B");string ltrim(string $str, string $char_mask=" \t\n\r\0\x0B");string rtrim(string $str, string $char_mask=" \t\n\r\0\x0B");
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参数<?php / 创建一个字符串,它旁边两边都包含多个空缺符; 打印该字符串的原始值,以便和之后进行比较。 / $str = " \tI like orange.\t "; var_dump($str); // 对原字符串调用trim()函数,并打印返回值。 $trimmed = trim($str); print "\n"; var_dump($trimmed); // 再次打印原始字符串,看它是否被改变。 print "\n"; var_dump($str);?>
以上代码的实行结果如图1所示,可以看到$str旁边两边的空缺符都被删除了,但中间的空缺符没有被删除。trim()函数实行之后,$str并不会被改变,由于函数用一个新字符串返回了在$str两边删除空缺符的结果。
图1 省略$char_mask参数的情形
3.2 利用$char_mask参数我们首先利用$char_mask参数来指明我们想删除其它的字符而非空缺符,然后再通过字符范围的办法来等价地指定这些字符。
<?php // 创建一个字符串,它旁边两边都包含多个待删除的字符 $str = "afkd The water is clean. dbhej"; var_dump($str); / 对原字符串调用trim()函数,同时指定要删除的字符为"abcdefghijk"; 并打印返回值。 / $trimmed1 = trim($str, "abcdefghijk"); print "\n"; var_dump($trimmed1); / 对原字符串调用trim()函数,同时指定要删除的字符为"a..k"; 并打印返回值。 / $trimmed2 = trim($str, "a..k"); print "\n"; var_dump($trimmed2); / 对原字符串调用trim()函数,同时指定要删除的字符为"a..gkijh"; 并打印返回值。 / $trimmed3 = trim($str, "a..gkijh"); print "\n"; var_dump($trimmed3);?>
该示例的实行结果如图2所示,可以看到紧挨着待删除字符的空缺符现在没有被删除,由于此时空缺符已不再属于要删除的字符。此外"a..k"等价于"abcdefghijk",且字符范围还可以和直接指明待删除字符的办法稠浊利用,比如"a..gkijh"实在也等价于"abcdefghijk"。
图2 用$char_mask参数指定要删除的字符
我们再来测试一下当指明字符范围的时候开始字符大于结束字符的情形,下面代码的实行结果如图3所示。可以看到有一条缺点指明我们在第10行代码中所指定的字符范围是缺点的;其次"d..a"相称于指定的删除字符是d、.(英文句点)和a这3个,而非一个字符范围。
<?php // 创建一个字符串,它旁边两边都包含多个待删除的字符 $str = "a.bcd The water is clean. cad"; var_dump($str); / 对原字符串调用trim()函数,同时指定要删除的字符为"d..a"; 并打印返回值。 / $trimmed = trim($str, "d..a"); print "\n"; var_dump($trimmed);?>
图3 缺点的字符范围指定办法的结果
3.3 ltrim()和rtrim()<?php // 创建一个字符串,它旁边两边都包含多个待删除的空缺符 $str = " I like orange. "; var_dump($str); / 对原字符串调用ltrim()函数, 并打印返回值。 / $trimmed1 = ltrim($str); print "\n"; var_dump($trimmed1); / 对原字符串调用rtrim()函数, 并打印返回值。 / $trimmed2 = rtrim($str); print "\n"; var_dump($trimmed2);?>
以上代码的实行结果如图4所示,可以看到ltrim()和rtrim()只是在字符串的左边或右边进行删除。
图4 ltrim()和rtrim()的效果
(完)