![]() |
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 |
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; ![]() |
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 |
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. |
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...> ![]() [/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 |
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; |
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 |
Re: Reguläre Ausdrücke - Vorgehensweise ?
Delphi-Quellcode:
...gibt dir den gesamten Inhalt, der sich in der Stringlist befindet, als einen String zurück.
TStringList.Text
|
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 21:55 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 by Thomas Breitkreuz