网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.delphi读取ini文件.
.Delphi中的线程类--之(1).
.如何用编程实现TDateTimePicker的.
.Delphi操作ACCESS技巧集.
.用Delphi创建服务程序.
.WANT的心得.
.TDBGrid中用Enter仿真Tab键盘.
.几本我不喜欢的Delphi书籍(之一.
.D7下的只能输入数字的控件(类似.
.DLL全局钩子.
.用程序模拟键盘和鼠标键盘.
.在Delphi中捕获控制台程序的输出.
.如何得到硬盘物理序号.
.用Delphi发送SMS(手机短消息服务.
.Delphi编程技巧(一)内存管理.
.深入GDI(图形设备接口)编程.
.在Delphi中ADSI创建Windows用户帐.
.ComboBox的DataValue值.
.如何访问一个进程的内存空间.
.用Delphi实现BP机、手机短讯.

打造Delphi中字符串的replace函数

发表日期:2006-2-4


打造Delphi中字符串的replace函数

编者注:其实Delphi的StringReplace函数就是专为满足这个需要而设的。但我们也将这篇文章发表出来——至少作者提供了一种替代方案,探索精神应该鼓励!
 
   这是小弟在这里的第一篇文章,加之自己水平也不是很高,就来讨论一个基础但是很实用的问题吧,希望能给大家一些帮助。
   用过vb的或asp的朋友都知道,在vb里有一个很实用的replace函数,它的功能是把一个字符串中与子串(又叫模式串)相匹配的串替换为指定的串。举个例子来说有这样一个字符串:s:=’apple is apple!’ ,用replace函数replace(s,’apple’,’box’)后,s就变为’box is box!’。串的长度也相应改变了。这是一个很有用的函数,大家都知道在开发数据库系统时会经常用到结构化查询语句sql,而这个语句中对有些字符是比较敏感的,比如说单引号,如果在sql语句中出现单引号(因为单引号是在sql中规定的一个有意义的字符)程序就会出现意想不到的错误,甚至可以被他人利用使系统产生严重安全漏洞(这就是著名的sql注入式攻击,相信大家还记得以前csdn论坛曾发现的这个漏洞吧)。这时你就需要在数据库操作时候将单引号替换为其他的字符串或空串,在读出数据的时候再替换回来,这样数据记录中就可以记录单引号,而不发生错误了。
   然而,我在delphi中却没有发现类似的函数(或许是我没找到?),实在是很不方便,于是自己写了一个,在以后的数据库系统开发中就方便多了。说了那么多废话,下面是代码,加上注释应该比较容易理解。
 
procedure replace(var s:string;const SourceChar:pchar;const RChar:pchar);
//第一个参数是原串,第二个是模式串,第三个是替换串
var
 ta,i,j:integer;
 m,n,pn,sn:integer;
 SLen,SCLen,RCLen:integer;//SLen表示原串的长度,SCLen表示模式传的长度,RCLen表示替换串的长度
 IsSame:integer;
 newp:array of char;//用来保存替换后的字符数组
begin
 SLen:=strlen(pchar(s));SCLen:=strlen(SourceChar);RCLen:=strlen(RChar);
 j:=pos(string(SourceChar),s);
 s:=s+chr(0);ta:=0;i:=j;
 while s[i]<>chr(0) do   //这个循环用ta统计模式串在原串中出现的次数
 begin
   n:=0;IsSame:=1;
   for m:=i to i+SCLen-1 do
   begin
    if m>SLen then begin IsSame:=0;break; end;
    if s[m]<>sourceChar[n] then begin IsSame:=0;break; end;
    n:=n+1;
   end;
   if IsSame=1 then begin ta:=ta+1;i:=m; end else i:=i+1;
 end;
 if j>0 then
 begin
  pn:=0;sn:=1;
  setlength(newp,SLen-ta*SCLen+ta*RCLen+1);//分配newp的长度,+1表示后面还有一个#0结束符
  while s[sn]<>chr(0) do //主要循环,开始替换
  begin
   n:=0;IsSame:=1;
   for m:=sn to sn+SCLen-1 do //比较子串是否和模式串相同
   begin
    if m>SLen then begin IsSame:=0;break; end;
    if s[m]<>sourceChar[n] then begin IsSame:=0;break; end;
    n:=n+1;
   end;
   if IsSame=1 then//相同
   begin
    for m:=0 to RCLen-1 do
    begin
     newp[pn]:=RChar[m];pn:=pn+1;
    end;
    sn:=sn+SCLen;
   end
   else
   begin //不同
    newp[pn]:=s[sn];
    pn:=pn+1;sn:=sn+1;
   end;
  end;
  newp[pn]:=#0;
  s:=string(newp); //重置s,替换完成!
 end;
end;
 
   其实这是一个基础的数据结构问题,在经常拖放控件编程的今天就全当练习数据结构吧。当然这个函数写的不是最优的,我测试了一下替换一万字的字符串,要半秒种的时间,时间复杂度还是比较高,如果各位有更优的办法,欢迎讨论!
上一篇:NeHe的opengl教程delphi版(4)----旋转 人气:4374
下一篇:NeHe的opengl教程delphi版(7)----滤波 人气:3816
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐