更有效率的字符串替换

今天研究了一下JS比较高级的正则表达式方法,发现一个我认为比原来的方法更有效率的字符串替换方法。
首先看看原来是怎么样做的:


function toTXT(str){
    str = str.replace(/\&/g, "& amp;");
    str = str.replace(/\>/g, "& gt;");
    str = str.replace(/\</g, "& lt;");
    str = str.replace(/\"/g, "& quot;");
    str = str.replace(/\'/g, "& #39;");
    return str;
}


分析:上面的方法是用来替换过滤字符串的HTML代码的,一直认为这样做很没效率,因为要把这个字符串进行5次全文匹配(不是数据库中的全文检索),有没方法只使用一次全文匹配,就可以替换掉不同的字符串为不同的结果呢?

呵呵,终于找到了下面的这个方法:


function toTXT(str){
    var RexStr = /\<|\>|\"|\'|\&/g
    str = str.replace(RexStr,
        function(MatchStr){
            switch(MatchStr){
                case "<":
                    return "& lt;";
                    break;
                case ">":
                    return "& gt;";
                    break;
                case "\"":
                    return "& quot;";
                    break;
                case "'":
                    return "& #39;";
                    break;
                case "&":
                    return "& amp;";
                    break;
                default :
                    break;
            }
        }
    )
    return str;
}


看上去要比第一个方法要复杂一些,写的代码也要多一点点,不过呢,只用一次,就可以替换整个字符串里面的匹配字符为不同的结果,非常有效率的。而且代码看上去也很直观,修改方便。

更重要的是第一个方法假如要替换"&"一定要放在最前面,而后面的方面完全不用担心这个问题。

JavaScript还有很多鲜为人知的用法,而且很多思想在别的语言里面都没有。就算JAVA再怎么强大,他的正则表达式却在JDK1.4里面才引入,落后了很多。不过我没说JAVA就一定比JS差只类的话啊。

JS的应用范围绝对不止HTML,还有很多其他的方面都在使用他,比如WebFT(测试网站的工具),.NET等,并且在即将发布,传说中“FLASH杀手”——WPF/E(Windows Presentation Foundation/Everywhere)出现后,JS的应用范围更加宽广。

很多人都不屑于JS,认为他很低级,连基本的对象类型都没有。NO,错了,在.NET里面,也就是Jscript.Net中,微软将JS的版本提升为8.0,基本上他已经与C#没有任何差别,所有程序语言该有的他都具备了。

说一个笑话,我写.net和ASP就用的Jscript,但是VB和C#我也并不是属于那种泛泛而谈的类型,只是我觉得假如可以用一门语言从后写到前,包括他的周边项目,那将是一件非常惬意的事情。从此再也不会在多种语言中转来转去了。

来看看WPF/E(Windows Presentation Foundation/Everywhere)的威力:

引用内容 引用内容

2005年的PDC大会上,微软介绍了一项名为WPF/E(Windows Presentation Foundation/Everywhere)的技术,在自己的MIX'06会议上又展示了新的特色。WPF/E依赖XAML和JavaScript来制作网页,它也带有跨平台工具,支持CLR、.NET、C#、VB.NET等的代码,实质上,它是一个与目前属于Adobe的Flash很类似的工具。

微软的程序员Mike Harsh曾经说过:“没错,我们正将C#带入Mac.”

虽然被大家认为是“Flash杀手”,不过微软的目标更远大一点:让用户不仅在桌面系统上使用微软的软件和技术,他们同样要占领网络和移动设备。

“实质上,WPF/E根本不是一个照搬的作品,它为开发者、设计师、技术员提供了一个综合性的开发设计平台。”开发者Joe Stegman说,“它能良好地与微软的其他产品结合,这一点是Flash平台望尘莫及的。”Stegman表示他们一直在很努力地进行WPF/E开发工作,已经发行了好几个内部版本,用户体验版在不久之后也会放出。

虽然现在Flash风光无限,有人可能认为微软的WPF/E没法超越Flash,不过想想多年以前网景的Netscape……

图为在浏览器中演示的矢量图形,可以随意对图形进行缩放、旋转




[本日志由 Clear 于 2006-11-14 11:40 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: javascript
相关日志:
评论: 8 | 引用: 0 | 查看次数: 8937
回复回复Vert[2008-05-31 11:25 AM | del]
replace 方法
返回根据正则表达式进行文字替换后的字符串的复制。

stringObj.replace(rgExp, replaceText)

参数
stringObj
必选项。要执行该替换的 String 对象或字符串文字。该字符串不会被 replace 方法修改。

rgExp
必选项。为包含正则表达式模式或可用标志的正则表达式对象。也可以是 String 对象或文字。如果 rgExp 不是正则表达式对象,它将被转换为字符串,并进行精确的查找;不要尝试将字符串转化为正则表达式。

replaceText
必选项。是一个String 对象或字符串文字,对于stringObj 中每个匹配 rgExp 中的位置都用该对象所包含的文字加以替换。在 Jscript 5.5 或更新版本中,replaceText 参数也可以是返回替换文本的函数。

回复回复Clear[2006-11-24 08:40 AM | del]
谢谢,我一直都还没时间去测试效率.
回复回复charlee[2006-11-23 09:26 PM | del]
我对这两个函数作了benchmark,发现新函数的效率约为原函数的1.4倍。虽然没有预想中那么高效率,但当要替换的字符串更多时,效率应该会提高吧。

测试方法为,对一个2048字节长的字符串分别执行两个函数100次,取其执行时间。下面为10次测试的结果。第一列为通常的作法,第二列为你的方法,第三列为两者之比。
1609    1204    75%
2250    1547    69%
1672    1313    79%
1813    1250    69%
1844    1219    66%
2063    1421    69%
2031    1172    58%
1797    1360    76%
2015    1281    64%
1860    1500    81%

测试程序放到我的blog上了。
http://charlee.itbdns.com/tech/archives/212.html
回复回复TANG[2006-11-17 10:43 AM | del]
AW你的msn多少,flash方面的知识需要请教你啊!
加我msn: tt1027@msn.com
回复回复aw[2006-11-16 12:14 AM | del]
js是一门美丽的语言。包括Flash的IDE内建的JSFL引擎也是基于js的。应用太广泛了。
回复回复tang[2006-11-15 06:30 PM | del]
O ,没看清楚
胡总的技术越来越扎实了
不得不服啊。。
回复回复Clear[2006-11-15 03:40 PM | del]
大哥,看清楚题目啊!
我是要按照不同的字符替换成他对应的ASCII啊,
不是要替换为空!
回复回复tang[2006-11-15 11:01 AM | del]
你可以直接把正则式写在一起
var regList=/(\&)|(\<)|(\>)|(\")|(\')/ig;
str = str.replace(regList,"");
另外,个人觉得flash的前途要大些,as3的新功能已经今非昔比,加上avm2开源。。。。
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭