Entwickler-Ecke
Open Source Units - StrTr für Delphi
n-regen - Fr 03.10.08 10:25
Titel: StrTr für Delphi
Hallo!
Da ich neben Delphi auch PHP programmiere, sind mir schon einige Funktionen von PHP aufgefallen, die es in Delphi nicht gibt. StrTr() ist eine davon.
Also habe ich die Funktion, die bestimmte Zeichen in einem String durch andere ersetzt, nachprogrammiert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function StrTr(Str:string; FromStr:string; ToStr:string;):string; var i:integer; begin Result := ''; for i := 1 to length(Str) do begin if pos(Str[i], FromStr) <> 0 then Result := Result + ToStr[pos(Str[i], FromStr)] else Result := Result + Str[i]; end; end; |
Die Syntax entspricht der in PHP, davon abgesehen, dass mein StrTr nicht mit Arrays umgehen kann. Ihr könnt also alles erforderliche in der PHP-Manual nachlesen:
http://de.php.net/manual/de/function.strtr.php
Ich hoffe wie immer, dass außer mir noch jemand die Funktion brauchen kann.
Gausi - Fr 03.10.08 10:33
Deinen Aufwand in allen Ehren, aber es gibt da so eine Funktion StringReplace. Außerdem funktioniert deine Funktion nur mit Strings, die ein Zeichen lang sind, die beiden hinteren Parameter sollten als Char sein. ;-)
jaenicke - Fr 03.10.08 10:34
StringReplace bzw. AnsiReplaceStr ist das eingebaute Pendant dazu in Delphi, letzteres in der Unit StrUtils.
GTA-Place - Fr 03.10.08 10:57
Seine Funktion macht aber IMHO leicht was anderes als StringReplace.
Delphi-Quelltext
1:
| StrTr('Drei kleine Chinesen', 'edc', 'atk'); |
Aus e wird a, aus d wird t und aus c wird k. In einem Rutsch. So hab ich das verstanden (aber nicht ausprobiert).
Narses - Fr 03.10.08 11:08
Moin!
GTA-Place hat folgendes geschrieben : |
Aus e wird a, aus d wird t und aus c wird k. In einem Rutsch. So hab ich das verstanden (aber nicht ausprobiert). |
Sehe ich auch so. ;)
Allerdings ist das Konzept in diesem Fall nicht gut: deutlich besser wäre es, am Anfang eine Ersetzungstabelle aufzubauen und dann inline den Ergebnisstring zu ersetzen. :idea: So ist das ein Performance-Killer und eine Speicherschleuder... :?
cu
Narses
Gausi - Fr 03.10.08 11:26
Ich geb mir einfach mal selbst den Dieter Nuhr für heute. :oops:
BenBE - Fr 03.10.08 13:14
Also ich hab da mal eben aus'm Kopf was gescriptet ... Ungetestet, sollte aber:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| function StrTr(Subject: String; FromStr, ToStr: String): String; var TrTbl: Array [Char] of record c: Char; del: Boolean; end; C: Char; I: Integer; PS: PChar; begin if Length(FromStr) < Length(ToStr) then Begin Result := Subject; exit; end;
for C := Low(TrTbl) to High(TrTbl) do begin TrTbl[C].C := C; TrTbl[C].Del := False; end; for I := 1 to Length(FromStr) do begin If I < Length(ToStr) Then begin TrTbl[FromStr[C]].C = ToStr[I]; end else begin TrTbl[FromStr[C]].Del = True; end; end;
Result := Subject; PS := @Result[1]; for I := 1 To Length(Subject) do begin With TrTbl[Subject[I]] do begin If Del Then Continue; PS^ := C; Inc(PS); end; end; SetLength(Result, (Integer(PS) - Integer(@Result[1])) div SizeOf(Char)); end; |
Sollte auch mit den Unicode-Varianten von Delphi korrekt funktionieren ...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!