Kannst du dich gedanklich von den Wildcards trennen?
(Siehe auch Posting vom Namenlozer)
Das was ich oben geschrieben habe gilt auch dann, wenn der Marker statt dem $-Zeichen ein String mit '###' ist; es wird nur etwas komplizierter.
Ich hab' da mal eine Klasse angefangen, weil ich selbst EMail-Templates brauchen könnte:
Delphi-Quellcode:
TStringReplaceEvent =
function(
const name:
string):
string;
TStringTemplate =
class(TObject)
private
FDelimiter:
string;
procedure SetDelimiter(
const Value:
string);
public
procedure FindTokens(
const s :
string; list:TStrings);
procedure ReplaceTokens(
const s :
string; event:TStringReplaceEvent);
property Delimiter :
string read FDelimiter
write SetDelimiter;
end;
...
procedure TStringTemplate.FindTokens(
const s:
string; list: TStrings);
var
i : Integer;
p1, l, sl : Integer;
begin
Assert(Assigned(list));
p1 := 0;
l := length(FDelimiter);
sl := Length(s);
if l = 0
then
raise Exception.Create('
TStringTemplate: Delimiter ist leer');
i := 1;
while i <= sl
do
begin
if Copy(s, i, l) = FDelimiter
then
begin
if p1 = 0
then
begin // öffnender Delimiter
p1 := i + l;
// Startpunkt merken
Inc(i, l);
// Delimiter überspringen
end
else
begin // schliessender Delimiter
list.Add(Copy(s, p1, i-p1));
p1 := 0;
Inc(i, l);
// Delimiter überspringen
end;
end;
Inc(i);
// nächstes Zeichen
end;
if p1 <> 0
then
raise Exception.Create('
TStringTemplate: schliessender Delimiter fehlt');
end;