深入了解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得到的结果是正确的,难道ltrim和trim的过滤机制不一样,其实查看文档很清楚,ltrim只是从字符串的左侧开始trim字符而已。至此好像问题,解决了,使用ltrim代替trim就可以了,至于具体原因,姑且可以认为是trim的一个bug。
但是,这里面蕴藏着一个巨大的bug。在上面的例子中,我定义的
$stie = “http://tbtest101.tmail.taobao.net”;
而过滤后,$site对象为
btest101.tmail.taobao.net
其实,仔细看下就会发现URL中的tbtest101,过滤后为btest101,把t也过滤了,使用trim与ltrim的效果都是一样的,只能再仔细看一下文档,
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,当然如果后面跟的是h和p这个字符一样会过滤到。
那么.net变成.ne的原因又是什么那?
trim除了上面提到的首字母匹配的规则外,还有一个规则,就是尾匹配过滤,如果.net的t修改为h,p字符一样会过滤掉,这就是尾过滤,应该说这种行为不是我们想要的行为,所以trim又分为ltrim,rtrim,
ltrim对应的策略就是我提到的第一种规则,字段首字母匹配。
rtrim对应的策略就是我提到的第二种规则,字段尾匹配。
而trim的策略正好是ltrim+rtrim的和。至此关于trim的所有讨论到此结束。
- 深入了解trim方案
- 深入了解MTK方案之“Scatter”文件学习
- trim()
- Trim
- trim
- trim()
- Trim
- trim
- $.trim()
- TRIM
- 深入了解计算机端口
- 深入了解C语言
- 深入了解C语言
- 深入了解计算机端口
- 深入了解INF文件
- 深入了解路由器
- 深入了解内存
- 深入了解C语言
- GPS
- 由对称性解2-SAT问题
- Linux环境进程间通信(一)
- 双引号分隔的标识符
- 实验二 网络层协议分析-2.1 ARP协议分析
- 深入了解trim方案
- 100句经典经验(值得用来时常提醒自己)
- 根据可执行文件名,获得这个文件的图标
- js_date函数
- struts中form表单提交过程中的中文乱码问题
- AOP思想实例讲解
- Linux环境进程间通信(二): 信号(上)
- 关于重复提交和struts的isTokenValid方法
- ActiveX