Delphi-PRAXiS
Seite 5 von 6   « Erste     345 6      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi wie benutze ich regular expressions? (https://www.delphipraxis.net/134919-wie-benutze-ich-regular-expressions.html)

nimmersattXD 5. Jun 2009 08:47

Re: wie benutze ich regular expressions?
 
so mein programm ist jetzt voll schnell *freu*

mir ist aber aufgefallen das durch meinen regulaeren ausdruck die bilder aus den htmlms leider nichts gefiltert werden! Von einer htmlm datei kann ich sicher ohne bedenken den quellcode reinstellen!

Code:






document.write("\n"+
"\n"+
"\n"+
"\n"+
"     \n"+
"\n"+
"     \n"+
"\n"+
"\n"+
"     \n"+
"     <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"summär&#x20ac;\" width=\"100%\">\n"+
"        <tr>\n"+
"           <td valign=\"top\"><a href=\"http:\/\/freizeichentoene.t-mobile.at\/index\" title=\"Alexander Rybak - Fairytales\"><img alt=\"Alexander Rybak - Fairytales\" border=\"0\" src=\"\/at\/app_pic\/modules\/right\/Freizeichenton_der_Woche_Alexander%20Rybak-Fairytales.jpg\" \/><\/a><\/td>\n"+
"        <\/tr>\n"+
"        \n"+
"     <\/table>\n"+
"  \n"+
"\n"+
"\n"+
"\n"+
"\n"+
"\n"+
"\n"+
"\n"+
"\n"+
"\n"+
"");

nahpets 5. Jun 2009 10:08

Re: wie benutze ich regular expressions?
 
Hallo,

versuch es mal mit
Code:
src=[\\]{0,1}".*"

nimmersattXD 5. Jun 2009 10:14

Re: wie benutze ich regular expressions?
 
ok also es werden mehr bilder gefunden, aber werden leider nich in meiner listbox angezeigt, mit deren inhalt ich weiterarbeite :(

nahpets 5. Jun 2009 10:49

Re: wie benutze ich regular expressions?
 
Hallo,

Du ermittelst per LastPos das letzte Vorkommen eines /. In Deinem HTML kann aber hinter dem letzten / aus der Pfad zum Bild noch ein / für ein schließendes HTML-Tag vorkommen. Du muss Dir hier eine andere Lösung suchen, da Du unterschiedlich strukturierte HTML-Seiten zu parsen hast.

Ausgehen von der von Dir geposteten HTML-Seite, müsste re.match mit diesem regulären Ausdruck
Code:
src=[\\]{0,1}".*"
eigentlich
Code:
src=\"\/at\/app_pic\/modules\/right\/Freizeichenton_der_Woche_Alexander%20Rybak-Fairytales.jpg\"
enthalten. Ist das bei Dir ebenfalls so?
Delphi-Quellcode:
if re.Exec(page.Text) then
repeat
  idx:=LastPos('/',re.match[1]);
  if idx > 0 then filename:=copy(re.Match[1],idx+1,40)
    else filename:=re.match[1];
  LiBoPicsFoundInPages.Items[i]:=filename;
until not re.ExecNext;
Ist das noch Dein derzeit aktuellen Quellcode? (Wenn nicht, bitte mal die aktuelle Version posten.)
Beim Copy werden von dem gefundenen String ab der letzten Position von / 40 Zeichen kopiert. Im Beispiel ist der Name des Bildes aber deutlich länger als 40 Zeichen, so dass hier zumindest was abgeschnitten wird.

Vorschlag:
Delphi-Quellcode:
copy(re.Match[1],idx+1,40)
ändern in
Delphi-Quellcode:
copy(re.Match[1],idx+1,Length(re.Match[1]))
um alles ab dem letzten / zu kopieren und dann diesen String weiterverarbeiten. Wenn der Aufbau aller Dateien identisch ist, dann könnte es damit funktionieren:
Delphi-Quellcode:
if idx > 0 then begin
  filename:=copy(re.Match[1],idx+1,Length(re.Match[1]));
  idx := Pos('\',filename);
  if idx > 0 then filename := copy(filename,1,idx - 1);
end else filename:=re.match[1];
Mir scheint, dass Du zwei recht unterschiedliche Arten von HTML-Dateien vorliegen hast, einmal "richtiges" HTML und einmal in HTML enthaltenes Javascript. Da die Dateien anscheinend unterschiedliche Dateiendungen haben, solltest Du sie eventuell separat behandeln, um die Komplexität ein bisserl zu reduzieren.

nat 5. Jun 2009 23:15

Re: wie benutze ich regular expressions?
 
Zitat:

Zitat von nahpets
In Deinem HTML kann aber hinter dem letzten / aus der Pfad zum Bild noch ein / für ein schließendes HTML-Tag vorkommen.

er wendet LastPos doch nur auf den dateinamen (inkl pfad) des bildes an. da dürfte zum schluss kein / mehr kommen.
und der regex bleibt eigentlich auch innerhalb des ersten tag, da sollte </bla> keine rolle spielen.

@nimmersattXD: du wolltest doch NUR image dateien die per [img]...[/img] angegeben sind rausfiltern, oder?
oder wollteste noch links etc auslesen?

wenn der source per js ausgegeben wird (so wie's aussieht) muß er ja nur noch die zus. \ fürs escapen beachten, mehr nicht.
oder übersehe ich da jetzt was?

edit:
Code:
<img .*?src=[\\]??"([^"]*)[\\]??"
sollte eigentlich beide finden, normale img-tags und die mit den escapten " in document.write
mußt dann nur in deiner routine den dateinamen nach \ durchsuchen, denn innerhalb des dateinamens
können (und sind sicherlich) auch zeichen escaped

nimmersattXD 8. Jun 2009 09:33

Re: wie benutze ich regular expressions?
 
so erstmal hier mein aktueller code:


Delphi-Quellcode:
procedure TForm1.BtnSearchSitClick(Sender: TObject);
var direct,filename:string;
    page:TStringList;
    i,j,idx:integer;
    re:TRegExpr;
    such:Boolean;
begin
direct:=Edpaths.Text;
//GetFilesInDirectory(direct,'*.html',LiBoSit.Items,true,true);
GetFilesInDirectory(direct,'*.htmlm',LiBoSit.Items,true,false);
//GetFilesInDirectory(direct,'*.jsp',LiBoSit.Items,true,false);

LbSit.Caption:=(IntToStr(LiBoSit.Count));


//routine zum suchen der Url in den htmls

page:=TStringList.Create;
re:=TRegExpr.Create;

   try
   for i:=0 to LiBoSit.Count-1 do
     begin
     page.LoadFromFile(LiBoSit.Items[i]);
     re.ModifierI:=true;
     re.ModifierG:=false;
     re.ModifierM:=false;
     re.ModifierS:=false;
     re.ModifierX:=false;
     re.Expression:='img .*?src=[\\]??"([^"]*)[\\]??';
     such:=re.Exec(page.Text);
     if such then
       repeat
       idx:=LastPos('/',re.match[1]);
         if idx > 0 then filename:=copy(re.Match[1],idx+1,length(re.Match[1]))
           else filename:=re.match[1];
       LiBoPicsFoundInPages.Items.Add(filename);
       Label12.Caption:=re.Match[1];
       until not re.ExecNext;
       end;
   finally
     page.Free;
     re.Free;
   end;

   LbPicsFoundInPages.Caption:=(IntToStr(LiBoPicsFoundInPages.Count));

end;
bei diesen RegAus hab ich nun das problem das er zwar sucht (das sehe ich an dem scrollbalken der in der listbox erscheint), die listbox an sich aber leider leer bleibt und ich mit ihr nicht weiterarbeiten kann.

das hier ist der code einer htmlm-datei:

Code:

document.write("\n"+ 
"\n"+ 
"\n"+ 
"\n"+ 
"     \n"+ 
"\n"+ 
"     \n"+ 
"\n"+ 
"\n"+ 
"     \n"+ 
"     <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"summär&#x20ac;\" width=\"100%\">\n"+ 
"        <tr>\n"+ 
"           <td valign=\"top\"><a href=\"http:\/\/freizeichentoene.t-mobile.at\/index\" title=\"Alexander Rybak - Fairytales\"><img alt=\"Alexander Rybak - Fairytales\" border=\"0\" src=\"\/at\/app_pic\/modules\/right\/Freizeichenton_der_Woche_Alexander%20Rybak-Fairytales.jpg\" \/><\/a><\/td>\n"+ 
"        <\/tr>\n"+ 
"        \n"+ 
"     <\/table>\n"+ 
"  \n"+ 
"\n"+ 
"\n"+ 
"\n"+ 
"\n"+ 
"\n"+ 
"\n"+ 
"\n"+ 
"\n"+ 
"\n"+ 
"");
aus ihr moechte ich "Freizeichenton_der_Woche_Alexander Rybak-Fairytales.jpg" als beispiel rausfiltern

nat 8. Jun 2009 10:13

Re: wie benutze ich regular expressions?
 
copy&paste sollte schon richtig angewendet werden. du hast den regex von mir gar nicht ganz kopiert, da fehlt was! :roll:
außerdem muß
Delphi-Quellcode:
ModifierG:=true;
wie ich auch schon geschrieben hatte. hab den regex jetzt (beim testen)
noch um ne kleinigkeit erweitert, nimm am besten diesen hier:
Code:
<img .*?src=[\\]??"([^"]*?)[\\]??"
(und diesmal ganz kopieren)
damit solltest du die dateinamen bekommen. mußt halt nur html-spezifische sachen noch konvertieren in deinem programm
(%20 für ein leerzeichen etc)

nimmersattXD 8. Jun 2009 11:03

Re: wie benutze ich regular expressions?
 
mmh kann leider nich kopieren, hab hier auf arbeit den rechner hier mit dem ich ins inet gehe, da ist aber leider kein delphi drauf, deswegen hab ich auch meinen leppie hier mit (bin fuer 6 wochen nur zum einsatz hier in london) der kein inet hat ...

is aba acuh nur ne bloede ausrede, richtig abschreiben muss ich ja trotzdem koennen, da haste recht :oops:

Delphi-Quellcode:

procedure TForm1.BtnSearchSitClick(Sender: TObject);
var direct,filename,afterspace,beforespace:string;
    page:TStringList;
    i,j,idx:integer;
    re:TRegExpr;
    such:Boolean;
begin
direct:=Edpaths.Text;
GetFilesInDirectory(direct,'*.html',LiBoSit.Items,true,true);
GetFilesInDirectory(direct,'*.htmlm',LiBoSit.Items,true,false);
//GetFilesInDirectory(direct,'*.jsp',LiBoSit.Items,true,false);

LbSit.Caption:=(IntToStr(LiBoSit.Count));


//routine zum suchen der Url in den htmls

page:=TStringList.Create;
re:=TRegExpr.Create;

   try
   for i:=0 to LiBoSit.Count-1 do
     begin
     page.LoadFromFile(LiBoSit.Items[i]);
     re.ModifierI:=true;
     re.ModifierG:=true;
     re.ModifierM:=false;
     re.ModifierS:=false;
     re.ModifierX:=false;
     re.Expression:='<img .*?src=[\\]??"([^"]*?)[\\]??"';
     such:=re.Exec(page.Text);
     if such then
       repeat
       idx:=LastPos('/',re.match[1]);
         if idx > 0 then filename:=copy(re.Match[1],idx+1,length(re.Match[1]))
           else filename:=re.match[1];
         idx:=LastPos('%20',filename);
         if idx > 0 then begin
         afterspace:=copy(filename,idx+3,length(filename));
         beforespace:=copy(filename,0,idx-2);
         filename:=beforespace+' '+afterspace;
         end;

       LiBoPicsFoundInPages.Items.Add(filename);
       until not re.ExecNext;
       end;
   finally
     LiBoPicsFoundInPages.Sorted:=true;
     page.Free;
     re.Free;
   end;

   LbPicsFoundInPages.Caption:=(IntToStr(LiBoPicsFoundInPages.Count));

end;
so mein neuer code!

hab das mit dem %20 so geloest, aba das wahre scheint das noch nichts zu sein :(
und die jsp-dateien musste ich auch ausklammern, weil es mit denen anscheinend nicht funktioniert!

nat 8. Jun 2009 12:07

Re: wie benutze ich regular expressions?
 
was ist denn an den jsp-dateien anders, dass es nicht klappt?
dem regex is es egal, was das für dateien sind, solange die sachen
die er suchen soll in dem format wie bei dem html von dir gepostet
ist. das mit dem %20 könntest du entweder auch wieder über einen
regex lösen, oder schnell eine eigene routine schreiben.
das würd in etwas so ablaufen:

1) nach % suchen
2) wenn gefunden, nächsten 2 zeichen holen
3) wenn TryStrToInt('$'+DieZweiZeichen, Code) = true, dann die 3 zeichen (% auch)
durch Chr(Code) ersetzen
4) mit 1) fortsetzen

mit dem $-zeichen am anfang sagst du der routine, dass es ein hex-wert ist (0..9, A..F)

nimmersattXD 8. Jun 2009 14:58

Re: wie benutze ich regular expressions?
 
ah ok ich das mit dem %20 jetzt einfach mit stringreplace gemacht!

und soweit ich es mitbekommen hab funzt es einigermaßen mit den jsp, nur manchmal rutschen u.a. auch keine bilder (siehe beispiel) mit in die listbox und auch felder mit keinem inhalt ...

bsp.:

<%=constants.getItemURL()%>?conentid= . . .


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 Uhr.
Seite 5 von 6   « Erste     345 6      

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