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');  // --> Trai klaina Khinasan                    


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!

user profile iconGTA-Place hat folgendes geschrieben Zum zitierten Posting springen:
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
  //Invalid Translation Table
  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 ...