AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Reguläre Ausdrücke - Vorgehensweise ?
Thema durchsuchen
Ansicht
Themen-Optionen

Reguläre Ausdrücke - Vorgehensweise ?

Ein Thema von Real-TTX · begonnen am 5. Jul 2009 · letzter Beitrag vom 6. Jul 2009
Antwort Antwort
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#1

Reguläre Ausdrücke - Vorgehensweise ?

  Alt 5. Jul 2009, 14:22
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Reguläre Ausdrücke - Vorgehensweise ?

  Alt 5. Jul 2009, 14:35
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
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Reguläre Ausdrücke - Vorgehensweise ?

  Alt 5. Jul 2009, 15:01
Delphi-Quellcode:
      
      repeat
        Links.Append(RegExpr.Match[1]);
      until not RegExpr.ExecNext;

Das wärs gewesen... Dank dir

Gruß, Real-TTX
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#4

Re: Reguläre Ausdrücke - Vorgehensweise ?

  Alt 5. Jul 2009, 15:11
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Reguläre Ausdrücke - Vorgehensweise ?

  Alt 6. Jul 2009, 21:06
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

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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Reguläre Ausdrücke - Vorgehensweise ?

  Alt 6. Jul 2009, 21:54
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;
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Reguläre Ausdrücke - Vorgehensweise ?

  Alt 6. Jul 2009, 23:11
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Reguläre Ausdrücke - Vorgehensweise ?

  Alt 6. Jul 2009, 23:13
TStringList.Text ...gibt dir den gesamten Inhalt, der sich in der Stringlist befindet, als einen String zurück.
  Mit Zitat antworten Zitat
Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Reguläre Ausdrücke - Vorgehensweise ?

  Alt 6. Jul 2009, 23:16
Hmm.... Dazu sag ich nichts ... *KOPF AUF TASTATUR KLOPF*...

Dank dir
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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