深入了解trim方案

今天碰见一个奇怪的问题,有必要和大家分享一个,是关于
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 carriage
return.

* "/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”

输出结果是
;

test
n

test
r

发现
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 specified
using the charlist
parameter. Simply list all characters that you want
to be stripped. With ..
you can specify a range of characters.

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

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

        

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

        
trim($test,”error”);

        

输出结果是

this is
trim 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
的所有讨论到此结束。

 

时间: 2024-12-20 21:10:46

深入了解trim方案的相关文章

Z-Blog分类标签全站静态化方案

Z-Blog目前已经实现了首页和文章页的静态化,可以生成HTML文件,但是系统的分类页.标签Tags页.归档页和作者页都没有实现静态化,本文将讲述一个非常简单的方案,能够自动生成各个分类页.归档页和Tags的静态HTML页面,以便用户将网站迁移到Apache等不支持ASP的主机上. Z-Blog的分类页.标签Tags页.归档页和作者页都是调用catalog.asp这个文件,因此,修改这个文件,当用户调用该文件的时候,自动生成针对该页面的HTML文件.如果访客反复读取这个文件,那么在一定时间范围内

实现placeholder效果的方案汇总

 方案一: 摒弃原始属性placeholder,为input添加一个兄弟节点span,并为span设置绝对定位(父节点为position: relative;),使其位于input之上.html代码片段如下: 1 2 3 4 5 6 7 8 9 10 11 12 <li> <div class="inputMD" style="position: relative;"> <input class="phInput"

PHP加Nginx实现动态裁剪图片方案

 这篇文章主要介绍了PHP加Nginx实现动态裁剪图片的方案,使用Imagick组件实现,需要的朋友可以参考下 许久以前写过一篇也是关于高性能PHP图片动态裁剪方案的文章,那文章使用的是nginx Cache和rewrite实现的,当然再加上CDN,那个方案存在一个问题就是图片并没有实际生成,而是以二进制的形式存在缓存中.如果缓存失效了那么还需要请求php再次生成.如果说到区别这是我暂且认为的吧. 利用空余时间,新增了静态生成图片支持,支持对图片3种模式切换,在门户网站自动对图片尺寸进行裁剪,减

JS trim去空格的最佳实践_javascript技巧

刚好上次有同学提出疑问.刚好可以自测一下.先来看看老道在<JavaScript 精粹>P33 写的吧.他对 String 对象扩展了一个 trim() 方法: 复制代码 代码如下: Function.prototype.method = function(name, func) { this.prototype[name] = func; return this; }; String.method('trim', function() { return this.replace(/^\s+|\

实现placeholder效果的方案汇总_jquery

placeholder是html5<input>的一个属性,它提供可描述输入字段预期值的提示信息(hint), 该提示会在输入字段为空时显示.高端浏览器支持此属性(ie10/11在获得焦点时文字消失),ie6/7/8/9则不支持.为了兼容各主流浏览器并使其呈现效果保持一致,以下三套方案仅供参考. 方案一: 摒弃原始属性placeholder,为input添加一个兄弟节点span,并为span设置绝对定位(父节点为position: relative;),使其位于input之上.html代码片段

【译】Asp.Net 导出 Excel 数据的9种方案

原文 http://www.cnblogs.com/garydot/archive/2012/06/04/excel-export.html 简介 Excel 的强大之处在于它不仅仅只能打开Excel格式的文档,它还能打开CSV格式.Tab格式.website table 等多钟格式的文档.它具备自动识别行号,字符,格式化数字等功能,例如:如果你在Excel 单元格中输入数字 "123456789012" 会自动转化为"1.23457E+11". 背景介绍 正因为E

ASP.NET MVC 多语言方案

原文 ASP.NET MVC 多语言方案 前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生了邮箱事件,我竟然忘了给邮箱密码赋值,导致遇到"邮箱不可用. 服务器响应为: 5.7.1 Unable to relay for"的问题,网上一查后,让Boss去设置IIS里的SMTP. 结果Boss力证不用设置也可以发,还给我发了N多Demo代码,让我蛋碎一地, 最后那点小激

PHP加Nginx实现动态裁剪图片方案_php实例

许久以前写过一篇也是关于高性能PHP图片动态裁剪方案的文章,那文章使用的是nginx Cache和rewrite实现的,当然再加上CDN,那个方案存在一个问题就是图片并没有实际生成,而是以二进制的形式存在缓存中.如果缓存失效了那么还需要请求php再次生成.如果说到区别这是我暂且认为的吧.利用空余时间,新增了静态生成图片支持,支持对图片3种模式切换,在门户网站自动对图片尺寸进行裁剪,减少服务器带宽,理论上应该也满足了业务的需求吧,图片裁剪使用了Imagick组件. 一.思路再现:1.先写好请求服务

ie 7/8不支持trim的属性的解决方案_javascript技巧

在ie 7 8浏览器中,如果使用trim()属性去除空格的话,则会导致报错. 因此解决这个问题有如下方案: var aa = $("#id").val().trim()   --- 在IE中无法解析trim() 方法 解决办法: [   var aa = $.trim($("#id").val());  ] 这个不好用,还是用下面介绍的吧,第一个已经过测试.  W3C那帮人的脑袋被驴踢了,直到java script1.8.1才支持trim函数(与trimLeft,t