![]() |
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€\" 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"+ ""); |
Re: wie benutze ich regular expressions?
Hallo,
versuch es mal mit
Code:
src=[\\]{0,1}".*"
|
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 :(
|
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:
eigentlich
src=[\\]{0,1}".*"
Code:
enthalten. Ist das bei Dir ebenfalls so?
src=\"\/at\/app_pic\/modules\/right\/Freizeichenton_der_Woche_Alexander%20Rybak-Fairytales.jpg\"
Delphi-Quellcode:
Ist das noch Dein derzeit aktuellen Quellcode? (Wenn nicht, bitte mal die aktuelle Version posten.)
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; 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:
ändern in
copy(re.Match[1],idx+1,40)
Delphi-Quellcode:
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:
copy(re.Match[1],idx+1,Length(re.Match[1]))
Delphi-Quellcode:
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.
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]; |
Re: wie benutze ich regular expressions?
Zitat:
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:
sollte eigentlich beide finden, normale img-tags und die mit den escapten " in document.write
<img .*?src=[\\]??"([^"]*)[\\]??"
mußt dann nur in deiner routine den dateinamen nach \ durchsuchen, denn innerhalb des dateinamens können (und sind sicherlich) auch zeichen escaped |
Re: wie benutze ich regular expressions?
so erstmal hier mein aktueller code:
Delphi-Quellcode:
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.
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; das hier ist der code einer htmlm-datei:
Code:
aus ihr moechte ich "Freizeichenton_der_Woche_Alexander Rybak-Fairytales.jpg" als beispiel rausfilterndocument.write("\n"+ "\n"+ "\n"+ "\n"+ " \n"+ "\n"+ " \n"+ "\n"+ "\n"+ " \n"+ " <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"summär€\" 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"+ ""); |
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:
wie ich auch schon geschrieben hatte. hab den regex jetzt (beim testen)
ModifierG:=true;
noch um ne kleinigkeit erweitert, nimm am besten diesen hier:
Code:
(und diesmal ganz kopieren)
<img .*?src=[\\]??"([^"]*?)[\\]??"
damit solltest du die dateinamen bekommen. mußt halt nur html-spezifische sachen noch konvertieren in deinem programm (%20 für ein leerzeichen etc) |
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:
so mein neuer code!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; 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! |
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) |
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= . . . |
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 :) |
Re: wie benutze ich regular expressions?
joa das stimmt scho mit der uebung, aber am montag fehlt mir irgendwie immer die motivation :?
|
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 :) |
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 ;)
|
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? |
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 ... |
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; |
Re: wie benutze ich regular expressions?
Delphi-Quellcode:
das problem ist, dass du hier immer in dem ursprungs-string ersetzt.
result:=StringReplace(url,hex,chr(code),[rfReplaceAll]);
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:
ist nur ein beispiel. kann man auch anders (und schneller) machen, aber das ist
result[idx] := Chr(code); //überschreibt das % zeichen mit dem echten zeichen
Delete(result, idx, 2); //löscht die beiden zahlen hinter dem % zeichen glaub ich eine lösung die am einfachsten zu verstehen ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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