Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   StringReplace-Funktion etwas aufbohren (https://www.delphipraxis.net/211076-stringreplace-funktion-etwas-aufbohren.html)

DieDolly 25. Jul 2022 12:22

AW: StringReplace-Funktion etwas aufbohren
 
Verschachtelte HTML-Tags kann ich nicht ausschließen.

himitsu 25. Jul 2022 12:25

AW: StringReplace-Funktion etwas aufbohren
 
Ja, aber doch nicht innerhalb eines
Delphi-Quellcode:
<img ....>


Problem bei RegEx ist, dass man z.B. zu einem <td> nicht das schließende </td> "sicher" finden kann, bei einer unbekanten Anzahl an weiteren Tags innerhalb.
Abgesehn davon, dass das Schließende sogar fehlen könnte.


Aber genau dafür gibt es für HTML passende Komponenten, genauso, wie man für XML auch eine XML-Komponente und kein StringReplace verwendet.

DieDolly 25. Jul 2022 12:27

AW: StringReplace-Funktion etwas aufbohren
 
Nein das nicht.

DBR 25. Jul 2022 15:53

AW: StringReplace-Funktion etwas aufbohren
 
Ich habe mir vor längerer Zeit mal einen Code gebastelt, der eingeklammerte Begriffe übergeht, und bei dem man zusätzlich bestimmen kann, wieviel Ersetzungen vorgenommen werden können. Nach längerem Suchen habe ich das Ding gefunden. Man braucht nur normale Klammern gegen spitze austauschen! Vielleicht hilft es. Wenn nicht, dann eben nicht.
Gruß DBR

function XReplace(const s, OldPattern, NewPattern: string; Number: integer;
IgnoreCase: Boolean; Auf: String = '('; Zu: String = ')'): string;
var
pc, ps, ph, x, z, lga, lgn, lgs: integer;
c, v: string;
begin
lga := length(OldPattern);
if (lga > 0) then
begin
lgn := length(NewPattern);
z := 0;
v := lowercase(OldPattern);
lgs := length(s);
try
x := 1;
while x <= lgs do
begin
c := copy(s, x, lga);
pc := pos(Auf, c);
ps := pos(Zu, copy(s, x + pc, maxint));
if (ps > 0) and (pc > 0) then
begin
ph := pos(Auf, copy(s, x + pc, maxint));
if (ph = 0) or (ph > ps) then
begin
Result := Result + copy(c, 1, pc);
inc(x, pc);
c := copy(s, x, ps);
Result := Result + c;
inc(x, ps);
continue;
end;
end;
if (c = OldPattern) or (IgnoreCase and (lowercase(c) = v)) then
begin
if lgn > 0 then
begin
Result := Result + NewPattern;
end;
inc(z);
inc(x, lga);
if z = Number then
break;
end
else
begin
Result := Result + copy(c, 1, 1);
inc(x);
end;
end;
Result := Result + copy(s, x, lgs - pred(x));
except
Result := 'FEHLER';
end;
end
else
Result := s;
end;

// Beispiel 1: ergibt 'Versuch1<Versuch2< Test3 >Versuch4<Test5> Versuch'
// da Test3 und Test 5 ordnungsgemäß in spitzen Klammern stehen
procedure TForm1.Button1Click(Sender: TObject);
var
Wieoft: integer;
Ignorcase: Boolean;
begin
Wieoft := -1; // Alle Vorkommen
Ignorcase := True; // bei False würde nichts ersetzt
ListBox1.items.add(XReplace('Test1<Test2< Test3 >Test4<Test5> Test', 'test',
'Versuch', Wieoft, Ignorcase, '<', '>'));
end;

// Beispiel 2: ergibt 'Versuch1<Versuch2< Test3 >Versuch4<Test5> Test'
// da das letzte "Test" bereits der vierte zu ändernde Begriff wäre
procedure TForm1.Button2Click(Sender: TObject);
var
Wieoft: integer;
Ignorcase: Boolean;
begin
Wieoft := 3; // nur die ersten drei, die nicht in spitzen Klammern stehen
Ignorcase := True;
ListBox1.items.add(XReplace('Test1<Test2< Test3 >Test4<Test5> Test', 'test',
'Versuch', Wieoft, Ignorcase, '<', '>'));
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz