Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Strings filtern (https://www.delphipraxis.net/3012-strings-filtern.html)

aaron 18. Feb 2003 10:56


Strings filtern
 
Hallo,
habe nur die Table Data Inhalte einer Html-Seite in einem Memo geladen.

Die gekürzte Version von dem was gefiltert werden soll, sieht so aus:
<B class=grey>Wartburg golf 4[/B]
, EZ: 01/03,

EUR 3.000

Ich möchte folgendes herausfiltern und in einer Listbox oder Memo ausgeben:
Wartburg golf 4
EZ: 01/03
EUR 3.000

Diese Informationen sind nicht nur einmal im Memo, sondernn ganz unterschiedlich, manchmal 50x, 3x...

Supergut wäre es auch wenn diese Daten in einer Zeile stehen könnten
Wartburg golf 4 - EZ: 01/03 - EUR 3.000

Wer mag mir dabei helfen?

Luckie 18. Feb 2003 11:08

Liste der Anhänge anzeigen (Anzahl: 3)
Stichwörter für die Hilfe:
pos, copy, delete, StringReplace.

Im Anhang noch mal zwei Projekte. Eins extrahiert Links aus einem Text und das andere E-Mail-Adressen. Beide funkltionieren nach unterschiedlichen Prinzipien.

Noch ein Tipp: Ersetz alle HTML-Tags mit StringReplace durch ein Trennzeichen zum Beispiel ";", dann fällt das Parsen einfacher. da habe ich auch noch was fällt mir ein. Das wäre meine bevorzugte Methode.

aaron 18. Feb 2003 11:15

DANKE, schau ich mir gleich an :D

aaron 18. Feb 2003 11:58

Supergut! Danke...
eins von den dreien hätte ich nun
<B class=grey>Wartburg golf 4[/B]
, EZ: 01/03,

EUR 3.000

also ich bekomme das jetzt herausgefiltert:
Wartburg golf 4


muss ich das für alle 3 "Suchbegriffe" wiederholen, oder geht das auch in einem? Mag mir das noch jemand zeigen?
Da ich die Ergebnisse schon sehr gerne in einer Listbox hätte.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   i: Integer;
   s, s1, s2: String;
begin
  i := 0;
  Listbox1.Clear;
  s2 := Memo1.Text;
  { so lange 'class=grey>' gefunden wird ist pos() > 0 }
  while pos('class=grey>', s2) > 0 do
  begin
    { kopieren der Zeichenfolge ab 'class=grey>' bis zum ersten Vorkommen von '"'
     -> Linkende }
    while s1 <> '<' do
    begin
      Inc(i);
      { immer 1 Zeichen nach s1 kopieren }
      s1 := copy(s2, pos('class=grey>', s2)-1+i, 1);
      { Überprüfen, ob s1 = ", wenn true Schleife verlassen }
      if s1 = '<' then break;
      { Zusammensetzten des Links }
      s := s + s1;
    end;
    { Hinzufügen des Links der in s steht in die Listbox }
    memo2.lines.Add(s);
    { Da pos() inmer nur das erste Vorkommen eines Teilstrings in einem String
    findet, wird der Text bis nach dem ersten Vorkommen abgeschnitten }
    s2 := copy(s2, pos('class=grey>', s2)+Length(s), Length(Memo1.Text));
      Memo2.text := StringReplace(Memo2.text, 'class=grey>', ' ',
                          [rfReplaceAll, rfIgnoreCase]);
    { Zurücksetzen der Variablen }
    s := '';
    s1 := '';
    i := 0;
  end;
 
end;

aaron 18. Feb 2003 17:07

ist echt dringend, ich kriege es einfach nicht hin...

Luckie 18. Feb 2003 23:13

Na sicher mußt du das jetzt für alle drei machen. Nur könnte das für die anderen zwei etwas schwer werden, da und ja häufiger vorkommen.

aaron 18. Feb 2003 23:16

verstehe ich, wäre aber cool gewesen wenn ich das hätte in eine funktion einbauen können, es funktioniert ja schon...ist nur tierisch langsam :(

gruss :D

Luckie 18. Feb 2003 23:20

Wie groß sind denn die Dateien?

Schnelle rist auf alle Fälle der String-Parser, denn da wird einfach nur der Pointer in der Zeichenkette weitergeschoben. Allerdings geht das nur mit einem Zeichen.

aaron 18. Feb 2003 23:22

188KB
ca 2500 Zeilen
ist ne Html-datei

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.

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-2025 by Thomas Breitkreuz