深入了解trim方案

来源:互联网 发布:电子签名算法 编辑:程序博客网 时间:2024/06/05 22:47

今天碰见一个奇怪的问题,有必要和大家分享一个,是关于trim的。trim在我们项目中应用场景比较多,所以非常有必要和大家分享一下。我们知道trim默认是过滤

* " (ASCII 32 (0x20)), an ordinary space.

* "/t" (ASCII 9 (0x09)), a tab.

* "/n" (ASCII 10 (0x0A)), a new line (line feed).

* "/r" (ASCII 13 (0x0D)), a carriagereturn.

* "/0" (ASCII 0 (0x00)), the NUL-byte.

* "/x0B" (ASCII 11 (0x0B)), a vertical tab.

这些字符的,同时我们也可指定过滤字段。我有一个需求需要过滤掉url中的http://,所以,我使用

$stie = “http://tbtest101.tmail.taobao.net”;

$site = trim($site, “http://”);

但是得到的结果是

btest101.tmail.taobao.ne

注意:URL中的最后的.net变成.ne,导致整个查询失败,然后我尝试使用

$stie = “http://tbtest101.tmail.taobao.cn”;

$stie = “http://tbtest101.tmail.taobao.com”;

$stie = “http://tbtest101.tmail.taobao.me”;

这些URL进行测试,发现他们都能输出正确结果。难道是最后的t对整个过滤有影响,然后我把测试条件修改为

$site = “test”;

果不出其然,输出结果是

tes

最后的一个t,果真没有了。这不禁让我想起了trim默认过滤/t,那么会不会以r,n结尾的字符,会不会也会过滤掉。

$site=” test n”;

$site=” test t”

输出结果是;

testn

testr

发现trim并没有因为查询语句有”//”trim过滤出现问题。然后我尝试使用ltrim进行测试

$stie = “http://tbtest101.tmail.taobao.net”;

$site = ltrim($site, “http://”);

结果是

btest101.tmail.taobao.net

发现ltrim得到的结果是正确的,难道ltrimtrim的过滤机制不一样,其实查看文档很清楚,ltrim只是从字符串的左侧开始trim字符而已。至此好像问题,解决了,使用ltrim代替trim就可以了,至于具体原因,姑且可以认为是trim的一个bug

         但是,这里面蕴藏着一个巨大的bug。在上面的例子中,我定义的
$stie = “http://tbtest101.tmail.taobao.net”;

而过滤后,$site对象为

btest101.tmail.taobao.net

其实,仔细看下就会发现URL中的tbtest101,过滤后为btest101,把t也过滤了,使用trimltrim的效果都是一样的,只能再仔细看一下文档,

charlist

Optionally, the stripped characters can also be specifiedusing the charlist parameter. Simply list all characters that you wantto be stripped. With .. you can specify a range of characters.

trim参数的第二项为string类型,变量名为charlist,仔细看一下文档描述,清楚的知道trim是过滤字符的,而不是过滤字符串的。而当我们希望过滤一个字符串中的一部分时,如果我们使用要过滤的字符串为过滤条件,那么这部分字符串肯定会过来掉,但是同时会引起其他怪异行为,这些怪异行为对trim来说是完全合法的。打个比方

$test = “thisis trim test, I find one bug, but is not a error”;

         如果我们想过滤上面字符串的中的error,使用trim,可能会这样用

         trim($test,”error”);

         输出结果是

this istrim test, I find one bug, but is not a

哈哈,输出正确,其实你了解trim的话,你可以这样写

trim($test,”eror”);

当然,也可以这样

trim($test,”eor”);

一样实现与trim($test,”error”);相同的效果。看到这里,我们应该大体了解trim的原理了。trim过滤字符的时候,是以首字符匹配为开始的,直到第一个不满足条件。这句话比较绕,用我一开始的例子说明吧!

         $stie =“http://tbtest101.tmail.taobao.com”;

我的过滤是

         $site =trim($site, “http://”);

过滤后的结果是

btest101.tmail.taobao.ne

之所以把tbtest101,过滤成btest101的,原因就是http://后面跟的是t,当然如果后面跟的是hp这个字符一样会过滤到。

那么.net变成.ne的原因又是什么那?

         trim除了上面提到的首字母匹配的规则外,还有一个规则,就是尾匹配过滤,如果.nett修改为hp字符一样会过滤掉,这就是尾过滤,应该说这种行为不是我们想要的行为,所以trim又分为ltrim,rtrim

ltrim对应的策略就是我提到的第一种规则,字段首字母匹配。

rtrim对应的策略就是我提到的第二种规则,字段尾匹配。

trim的策略正好是ltrim+rtrim的和。至此关于trim的所有讨论到此结束。