Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->编程语言 ->Delphi ->打造Delphi中字符串的replace函数
  相关分类: 
ASP
ViualBasic
UML / Rational Rose
PHP4/PHP5
Perl
JAVA/JSP教程
Delphi
ColdFusion
CGI
C/C++
ASP.NET
XML
  站内搜索: 
热门文章排行
热门文章排行 Delphi字符串函数大全(06-05)
Windows的DDE原理(06-05)
制作QQ消息炸弹(06-05)
delphi中的XML解析控件TXMLDocument(06-05)
谈Delphi编程中“流”的应用(06-05)
精采文章排行
精采文章排行 如何用Delphi制作录音程序(06-05)
谈Delphi编程中“流”的应用(06-05)
如何把数据库的内容写入到Word文档中(06-05)
从实作标题栏按钮开始浅谈组件的制作(06-05)
“98五笔字型输入法”大批量造词(06-05)
  ·谈Delphi编程中“流”的应用·如何把数据库的内容写入到Word文档中?·从实作标题栏按钮开始浅谈组件的制作·“98五笔字型输入法”大批量造词·关于Delphi大Bug的更详细的例子·不知您是笨蛋,还是我是笨蛋,关于Delphi·剖析TThread类·理解类引用这种类型·改良控件-Delphi自带控件Bug的消除

打造Delphi中字符串的replace函数

作者:Webmaster   来源:Linuxdby.com   点击:   日期:2007-06-05 [收藏] [投稿]

  IE是否经常中毒?推荐您

打造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

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页12 下一页

上一篇:NeHe的opengl教程delphi版(4)----旋转   下一篇:动态生成合计
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论

   相关文章:
·如何用Delphi制作录音程序

   文章评论:(2条)
  
 请留名: 匿名评论   点击查看所有评论 论坛讨论
 

 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。