Delphi-PRAXiS
Seite 2 von 2     12   

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= . . .

nat 8. Jun 2009 15:10

Re: wie benutze ich regular expressions?
 
%20 ist sicher, das häufigste vorkommen in diesem format, trotzdem können aber noch
andere zeichen mit % zeichen encodiert sein. %00 bis %FF kann vorkommen (theoretisch).
ich würde das etwas variabler machen (so wie ich das im letzten post geschrieben habe).
damit kannste alle zeichen umwandeln. dein stringreplace kennt nun nur %20.

und zu den jsp-dateien:
dann mußt du deinen filename weiter filtern, dass halt keine <%= und %> zeichen
drin vorkommen dürfen. wieder entweder per regex oder per eigener kleinen routine.
ist doch ne gute übung :)

nimmersattXD 8. Jun 2009 15:13

Re: wie benutze ich regular expressions?
 
joa das stimmt scho mit der uebung, aber am montag fehlt mir irgendwie immer die motivation :?

nat 8. Jun 2009 15:28

Re: wie benutze ich regular expressions?
 
ob deine motivation steigt, wenn dein programm wegen so einer "schlamperei" irgerdwann auf einmal nicht mehr geht.
ich weiß ja nicht... bin der meinung wenn, dann richtig :)

nimmersattXD 8. Jun 2009 15:41

Re: wie benutze ich regular expressions?
 
naja deswegen geb ich ja auch noch nich auf, eigentlich is das programm ja soweit schon fertig, aba ich wills halt verbessern und so!! kennst du das nich das montag ein arschloch is ;)

nat 8. Jun 2009 16:33

Re: wie benutze ich regular expressions?
 
hmm, eigentlich nicht :)
ich sehe sowas immer als herausforderung.
wenn man es dann geschaft hat und die routine läuft
is die freude um so größer.

mal so aus neugier, wozu soll das prog eigentlich gut sein?

nimmersattXD 8. Jun 2009 16:52

Re: wie benutze ich regular expressions?
 
es soll ungenutzte bilder filtern, also im mom laeuft es so:

als erstes werden alle bilddateien aus den ordnern in ein listbox aufgelistet, dann macht man das gleiche mit den seiten (html,htmlm, jsp) gleichzeitig werden die urls der bilder extrahiert (das was ich die ganze zeit mache) und zum schluss vergleiche ich die beiden listboxen un splitte in zwei neue boxes auf, eine fuer genutzte bilder und eine fuer ungenutzte

mein chref hat mir gesagt ich wuerde mit regex, hashtabellen und threading das programm schneller machen, leider hatte ich von allem noch nichts gehoert und da er nicht mit delphi arbeitet erarbeite ich mir das jetzt selbst und mit deiner hilfe ;D hatte also erstmal mein angefangen mien prog mit regex umzubauen, wenn das richtig funst dann will ich die url der bilder in hashtabellen speichern und zum schluss mal sehn ... bin ja nur noch drei wochen hier und hab noch andere aufgaben nebenher ... das mit dem programm is ja mehr oder weniger beschaeftigung, die meinem chef vllt hilft die ganzen alten bilder, die in den seiten nicht mehr genutzt werden zu loeschen ...

nimmersattXD 9. Jun 2009 10:12

Re: wie benutze ich regular expressions?
 
so ich hab mir jetzt ne funktion gebastelt, leider funktioniert sie nicht so wie sie sollte: also im gunde genommen passiert gar nichts, keine fehlermeldung und bei der ausgabe sieht der string genauso aus wie bei der eingabe :( aba so wie ich dich langsam einschaetze, findest du meinen fehler gleich !


Delphi-Quellcode:

function ReplaceHex(url: string):string;
var idx,code: integer;
    hex: string;
begin
  idx:=0;
  result:=url;
  repeat
    idx := PosEx('%',url,idx+1);
    if idx>0 then
      begin
      hex:=copy(url,idx+1,2);
      if TryStrToInt('$'+hex,code) then
        begin
        hex:= copy(url,idx,3);
        result:=StringReplace(url,hex,chr(code),[rfReplaceAll]);
        end;
      end;
  until idx = 0;

end;

nat 9. Jun 2009 12:32

Re: wie benutze ich regular expressions?
 
Delphi-Quellcode:
result:=StringReplace(url,hex,chr(code),[rfReplaceAll]);
das problem ist, dass du hier immer in dem ursprungs-string ersetzt.
wenn mehr als ein %xx zeichen drin ist, dann wird nur das letzt ersetzen "übernommen"
beispiel: "hallo%20welt%A0bla"

nach dem 1. ersetzen: "hallo welt%A0bla"
nach dem 2. ersetzen: "hallo%20welt bla"

du mußt immer wieder in deinem result string arbeiten.
allerdings finde ich es nicht so günstig mit strinreplace zu arbeiten
(grade wenn es dir auf geschwindigkeit ankommt). du gehst doch deinen
string schon mit pos/posex durch... dann bau dir den string doch selber
zusammen. du köntest z.B. einfach in der schleife sowas in der art machen
Delphi-Quellcode:
result[idx] := Chr(code); //überschreibt das % zeichen mit dem echten zeichen
Delete(result, idx, 2); //löscht die beiden zahlen hinter dem % zeichen
ist nur ein beispiel. kann man auch anders (und schneller) machen, aber das ist
glaub ich eine lösung die am einfachsten zu verstehen ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 Uhr.
Seite 2 von 2     12   

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