Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Reguläre Ausdrücke - Vorgehensweise ? (https://www.delphipraxis.net/136663-regulaere-ausdruecke-vorgehensweise.html)

Real-TTX 5. Jul 2009 14:22


Reguläre Ausdrücke - Vorgehensweise ?
 
Hi,

Ich möchte eine HTML Datei Parsen. Und diverse Links herausfiltern. Ich bin mit meiner momentanen Lösung sehr sehr Unzufrieden...

Im Moment : Nehme ich den Inhalt und Überprüfe Zeile für Zeile... Und setze verschiedenen boolean Variablen. Die angeben in welcher Tabelle ich mich befinde etc. Damit ich nicht Links bekomme die außerhalb der Tabelle liegen und zwar dem gleichen Muster entsprechen aber nicht relevant sind. Sehr sehr Unsauber :(

Gibt es eine leichtere Möglichkeit. Zum Bleistift den kompletten Inhalt in eine Variable zu packen und dann zu Parsen. Gruppierungen im Ausdruck oder Alternationen etc... ?

Oder wird das eher Schwierig ?


Gruß, Real-TTX

omata 5. Jul 2009 14:35

Re: Reguläre Ausdrücke - Vorgehensweise ?
 
Delphi-Quellcode:
procedure GetHTMLLink(HTML:string; Links:TStrings);
var RegExpr:TRegExpr;
begin
  Links.Clear;
  RegExpr:=TRegExpr.Create;
  try
    RegExpr.ModifierG:=false;
    RegExpr.Expression:='href="(.*)"';
    if RegExpr.Exec(HTML) then begin
      repeat
        Links.Append(RegExpr.Match[1]);
      until not RegExpr.ExecNext;
    end;
  finally
    RegExpr.free;
  end;
end;
RegExpr

Real-TTX 5. Jul 2009 15:01

Re: Reguläre Ausdrücke - Vorgehensweise ?
 
Delphi-Quellcode:
     
      repeat
        Links.Append(RegExpr.Match[1]);
      until not RegExpr.ExecNext;

Das wärs gewesen... Dank dir :)

Gruß, Real-TTX

himitsu 5. Jul 2009 15:11

Re: Reguläre Ausdrücke - Vorgehensweise ?
 
Wenn es nur Links sein sollen, welche aus einer bestimmten Tabelle auf der Seite stammen,
dann hätte man natürlich auch einfach einen HTML-Parser nehmen können, sich in dessen Struktur zu der Tabelle durchzuarbeiten und dann in dieser die Links zu suchen.

Real-TTX 6. Jul 2009 21:06

Re: Reguläre Ausdrücke - Vorgehensweise ?
 
Danke nochmals für die Antworten...

Leider stecke ich schon wieder ein bisschen in der Klemme. Ich will eine HTML Datei filtern die folgend aufgebaut ist :

[code
span class=....>Hier steht der Text, der zur nachfolgenden Zeile gehört....</span>
<xy...>Klick
[/code]

Wie ich das im moment versuche zu lösen ist mehr als schlecht - funktioniert ja auch nicht :P

Delphi-Quellcode:


function getLinks(aLink : string; aExpression : WideString; aExpressionPre : WideString) : TLinks; overload;

.....

function TMyFuckingTestClass.getLinks(aLink : string; aExpression : WideString; aExpressionPre : WideString) : TLinks;
var
  objRegEx : TRegExpr;
  objRegExPre : TRegExpr;
  objContent : TStringList;
  intCounter : integer;
  blnFounded : boolean;
begin

  objRegEx := TRegExpr.Create;
  objRegEx.Expression := aExpression;
  objRegEx.ModifierG := false;

  objRegExPre := TRegExpr.Create;
  objRegExPre.Expression := aExpressionPre;
  objRegExPre.ModifierG := false;

  objContent := TStringList.Create;
  objContent := objHTTP.DownloadToStringList(aLink); // nur der Download....

  blnFounded := false;

  for intCounter := 0 to objContent.Count - 1 do
  begin
      // Name herausfiltern (Erste Zeile)
      if (objRegExPre.Exec(objContent[intCounter])) then
      begin
        repeat
          if (Length(result) >= 1) then
          begin
            SetLength(result,Length(result)+1);
          end else begin
            SetLength(result, 1);
          end;
          blnFounded := true;
          result[Length(result)-1].Name := objRegExPre.Match[1];
        until not objRegExPre.ExecNext;
      end;
      // Link herausfiltern (folgende Zeile)
      if objRegEx.Exec(objContent[intCounter]) then
      begin
        repeat
          if blnFounded = true then
          begin
            result[Length(result)-1].Link := objRegEx.Match[1];
            blnFounded := false;
          end;
        until not objRegEx.ExecNext;
      end;

  end;

end;

....

  result := xy.getLinks(aLink, 'href="(http\:\/\/alink\.org\/.+)"', '

[b](.+)<\/strong>'); // Link der erste Ausdruck und Name der zweite.... Aber funktioniert einfach nicht :O

Danke euch...

Gruß, Real-TTX

omata 6. Jul 2009 21:54

Re: Reguläre Ausdrücke - Vorgehensweise ?
 
Warum so kompliziert?

Delphi-Quellcode:
procedure GetHTMLLink(HTML:string; Links:TStrings);
var RegExpr:TRegExpr;
begin
  Links.Clear;
  RegExpr:=TRegExpr.Create;
  try
    RegExpr.ModifierG:=false;
    RegExpr.Expression:='<span[^>]*>(.*)<\/span>.*<a href="(.*)"[^>]*>(.*)<\/a>';
    if RegExpr.Exec(HTML) then begin
      repeat
        Links.Append(
          trim(RegExpr.Match[1]) + ' | ' +
          trim(RegExpr.Match[2]) + ' | ' +
          trim(RegExpr.Match[3])
        );
      until not RegExpr.ExecNext;
    end;
  finally
    RegExpr.free;
  end;
end;

Real-TTX 6. Jul 2009 23:11

Re: Reguläre Ausdrücke - Vorgehensweise ?
 
So hätte ich es auch gemacht. Das Problem ist, dass ich das Zeile für Zeile abarbeite mittels TStringList...

Oder gibt es eine Eigenschaft die den kompletten Inhalt von einer TStringList anzeigt?

Hmm.. Aber danke für die kompetente Antwort :)

Gruß, Real-TTX

omata 6. Jul 2009 23:13

Re: Reguläre Ausdrücke - Vorgehensweise ?
 
Delphi-Quellcode:
TStringList.Text
...gibt dir den gesamten Inhalt, der sich in der Stringlist befindet, als einen String zurück.

Real-TTX 6. Jul 2009 23:16

Re: Reguläre Ausdrücke - Vorgehensweise ?
 
Hmm.... Dazu sag ich nichts ... *KOPF AUF TASTATUR KLOPF*...

Dank dir ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:14 Uhr.

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