Delphi-PRAXiS
Seite 1 von 2  1 2      

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 1. Jun 2009 16:33


wie benutze ich regular expressions?
 
Hallo an alle,
ich habe schon ausgiebig nach eine loesung zu meinem problem gesucht, aba leider nichts gefunden, deswegen ein neues thema...

ich habe bisher noch nie von regular expressions gehoert, soll aba damit mein programm schneller machen, was bis jetzt sehr langsam ist

ich moechte aus html und htmlm dateien alle genutzten bilder raussuchen (ob nun jpg, png oder anderer formate), mit den regular expressions soll das ja leicht sein, nur hab ich keine ahnung wie man die benutzt, sind das funktionen die in delphi7 schon drin sinn oder wie muss ich das verstehen?? (da ich vista hab geht meine delhpi hilfe leider auch nicht :( )

bitte helft mir!!

omata 1. Jun 2009 16:37

Re: wie benutze ich regular expressions?
 
klick

Beispiel: klick

Bernhard Geyer 1. Jun 2009 16:40

Re: wie benutze ich regular expressions?
 
Für deinen Zweck ist nicht RegEx die zu vervorzugende Technik sondern ein HTML-Parser. Hierzu läst du die datei im TWebBrowser und gehst über das Document-Property welches vom Type IHTMLDocument2 ist (MSHTML.pas) und dort findest du eine Images-Auflistung. Funktioniert auch wenn statt HTML XML + XSLT vorliegt. Einig beim MS Word-HTML versagt diese Technik teilweise das das MS Word HTML teilweis alles anderes als vernünftiges HTML ist.

toms 1. Jun 2009 16:55

Re: wie benutze ich regular expressions?
 
Ein HTML Parser ist z.B. IEParser von bsalsa.com
Damit kann man ganz einfach Bilder etc aus einer URL herausfiltern.

Delphi-Quellcode:
uses
 {...}IEParser, MSHTML_EWB;

procedure TForm1.IEParser1OnImage(Sender: TObject; Source: String;
  ImgElement: IHTMLImgElement; Element: TElementInfo);
begin
  Memo1.Lines.Add(ImgElement.href);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  IEParser: TIEParser;
begin
  IEParser := TIEParser.Create(Self);
  try
    IEParser.OnImage := IEParser1OnImage;
    IEParser.Parse('http://delphipraxis.net');
  finally
    IEParser.Free;
  end;
end;

nimmersattXD 2. Jun 2009 09:50

Re: wie benutze ich regular expressions?
 
hui also vielen dank schonmal fuer die hilfreichen sachen!

das einzige was ich vllt nich richtig erklaert hab, ich habe die html und htmlm dateien richtig in ordnern, also brauche ich gar nicht in inet gehen :)

ich hab mich jetzt auch auf der seite von omata die RegExpr unit geholt und mich weiter informiert (wikipedia) hab jetzt auch das prinzip verstanden! was mir jetzt noch kopf zerbrechen bringt ist, wie ich das mit den htmls realisiere, da es glaub ich unsinn waere den ganzen quelltext der htmls in das programm zu laden und das dann durchzusuchen!

hat jemand vielleicht dazu eine idee??

das waere unheimlich nett!!

ps: Ich habe im Grunde nur ein bisschen Schulwissen von Delphi, dass mit den HTML parser hab ich deshalb noch nicht richtig verstanden :coder2:

nimmersattXD 3. Jun 2009 14:29

Re: wie benutze ich regular expressions?
 
hat keiner einen tipp fuer mich?

nimmersattXD 4. Jun 2009 11:03

Re: wie benutze ich regular expressions?
 
mmh gut ich hab jetzt erstmal probeweise mit loadfromfile den html-code in eine strinlist geladen!

Diesen text durchsuche ich mit re.Expression := '(.+).(jpg|png|pdf|bmp|gif)';

Leider gibt das Programm mir dann den ganzen html text aus, ich moechte aber nur die bild-dateinamen! Was hab ich falsch gemacht?

nat 4. Jun 2009 11:40

Re: wie benutze ich regular expressions?
 
probier es doch ma damit
Code:
<img .*src="([^"]*)"
greedy sollte dabei allerdings aus!

nimmersattXD 4. Jun 2009 11:44

Re: wie benutze ich regular expressions?
 
ähm da gibt das programm mir gar nichts aus! Hat denn jemand ne idee warum meins alles ausgiebt? es muesste doch sonst richtig sein oder?

ich freu mich auch ueber neue varianten!

freak4fun 4. Jun 2009 11:47

Re: wie benutze ich regular expressions?
 
Zeig doch mal deine Version. Vielleicht kann man darauf aufbauen. ;)

nimmersattXD 4. Jun 2009 11:51

Re: wie benutze ich regular expressions?
 
meine version hab ich ja schon geschrieben, aber hier mal ein teil meines quellcodes

Code:

//routine zum suchen der Url in den htmls

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

try
    page.LoadFromFile(LiBoSit.Items[0]);
    re.Expression:='(.+).(jpg|png|pdf|bmp|gif)';
    if re.Exec(page.Text) then
      begin
      LbTest.Caption:=re.Match[0]
      end;
  finally
    page.Free;
    re.Free;
  end;

nat 4. Jun 2009 12:14

Re: wie benutze ich regular expressions?
 
also habs grad getestet, meine expr geht bei mir.
wie sieht denn dein html aus?
wie gesagt, das hier geht bei mir:
Delphi-Quellcode:
var
  Succ: Boolean;
begin
  with TRegExpr.Create do
  try
    ModifierG := false;
    Expression := '<img .*src="([^"]*)"';
    InputString := Memo1.Text;
    Succ := Exec;
    while Succ do
    begin
      showmessage(Match[1]);
      Succ := ExecNext;
    end;
  finally
    Free;
  end;
end;

nimmersattXD 4. Jun 2009 12:38

Re: wie benutze ich regular expressions?
 
also das is ne index.html im moment mit der ich austeste, da is auch java drin un alles! ansonsten muss ich dann auch htmlms durchsuchen!

ich hab deins jetzt noch mal bei mir eingesetzt und jetzt kommen bei mir die ganzen src tags raus, aber auch links und tabellen! das ist auf jedenfall schonmal eine verbesserung zu meinem, aba leider noch nicht das was ich brauche!

das was ich rausbekommen moechte ist konkret: bildname.jpg (zum Bleistift :))

nat 4. Jun 2009 12:45

Re: wie benutze ich regular expressions?
 
und genau das bekomme ich bei mir :)
poste hier ma den quelltext von deinem html.
dann kann ich das auch mal testen.

nimmersattXD 4. Jun 2009 12:50

Re: wie benutze ich regular expressions?
 
mist das wuerd ich gern machen, aber ich glaub das is betriebsintern :(


hab das jetzt aber mal ueber ne htmlm laufen lassen und da kommt das raus:

[img]/at/app_pic/sapcer.gif[/img]</td>

nat 4. Jun 2009 12:52

Re: wie benutze ich regular expressions?
 
kannst du nich schnell mal n auszug nehmen und die texte/links austauschen? dann is doch nichts mehr drin!
wie gesagt, bei mir klappt das alles problemlos. du achtest auch darauf Match[1] zu nehmen statt
Match[0]? in Match[0] ist der img-tag, in Match[1] nur der dateiname!

nimmersattXD 4. Jun 2009 13:00

Re: wie benutze ich regular expressions?
 
aaaaaah das wusst ich nicht mit dem match[1] jetzt sieht das schon besser aus :D aber leider is noch der pfad mit dabei! bekomm ich den noch irgendwie weg? wenn nich muss ich damit weiterarbeiten!

nahpets 4. Jun 2009 13:04

Re: wie benutze ich regular expressions?
 
Hallo,

versuche es mal bitte mit
Delphi-Quellcode:
ModifierI := True;
ModifierG := false;
ModifierM := false;
ModifierS := false;
ModifierX := false;
Expression := '<img .*src=".*"';
Zum Testen habe ich diese Seite hier aus der DP, in der wir gerade Schreiben, genommen, eventuell könnt Ihr euch zum Testen ja erstmal auf diese Seite einigen, um gleiche Ausgangsvorausetzungen zu haben.
Das Problem sind vermutlich Bilder, die gleichzeitig als Links genutzt werden, bzw. Bilder, hinter deren Tag weitere Tags folgen, die Hochkommata enthalten.

Stephan

nat 4. Jun 2009 13:22

Re: wie benutze ich regular expressions?
 
naja, das is ja schnell gemacht...
- letzte position von / ermitteln
- wenn gefunden von da bis ende des strings kopieren
das sollte man auch ohne regex hinkriegen :)

nimmersattXD 4. Jun 2009 13:23

Re: wie benutze ich regular expressions?
 
schnell gemacht?? sowas hab ich noch gar nich gemacht! ich hab vor kurzen ne funktion pos() gesehen! damit meinst du?

nat 4. Jun 2009 13:39

Re: wie benutze ich regular expressions?
 
jo, genau...
ich will mal nicht so sein:
Delphi-Quellcode:
uses StrUtils; //für posEx
...
function LastPos(const Needle, Haystack: String): integer;
var idx: integer;
begin
  result := 0;
  idx := 0;
  repeat
    idx := posEx(Needle, Haystack, idx+1);
    if idx > 0 then
      result := idx;
  until idx = 0;
end;

//und später dann
var
  idx: integer;
begin
  ...
  idx := LastPos('/', Match[1]);
  if idx > 0 then
    Filename := copy(Match[1], idx)
  else
    Filename := Match[1];

  //in Filename hast du jetzt nur den dateinamen!
  ...
end;
is nu so ausm kopf... denke aber ma wird wohl klappen.
guck dir den source an und versuch ihn zu verstehen!

nimmersattXD 4. Jun 2009 13:44

Re: wie benutze ich regular expressions?
 
hui mit nem ganzen quelltext hab ich nicht gerechnet!

vielen lieben dank!! hast mir sehr geholfen !!

fuer ein paar andere fragen mach ich neue themen auf ;)

nat 4. Jun 2009 13:52

Re: wie benutze ich regular expressions?
 
ich hab grad nochma etwas mit der regex rumgespielt...
damit könnte das auch gehen
Code:
[img]([^[/img]ModifierG := true;
gesetzt werden.

edit:
jo jo, kein problem :)
ich werd dann ma gucken was da so steht! ;)

nimmersattXD 4. Jun 2009 14:11

Re: wie benutze ich regular expressions?
 
oehm bin grad beim schreiben, aber :


Filename := copy(Match[1], idx)
else
Filename := Match[1];



also bei der autovervollstaendigung is kein copy drin! :oops:

nat 4. Jun 2009 14:20

Re: wie benutze ich regular expressions?
 
einfach mal "copy" markieren und F1 drücken :)
Delphi-Quellcode:
function Copy(S: string; Index: Integer; Count: Integer): string;
mußt bei meinem beispiel oben noch die länge hinten mit angeben, hab ich wohl vergessen.
sollteste aber wohl hinkriegen :)

nimmersattXD 4. Jun 2009 14:44

Re: wie benutze ich regular expressions?
 
ach was denkste wie gern ich f1 benutzten wuerde :( hab vista da geht die hilfe leider nich ... zum kotzen, jetzt wo man sie nicht hat vermisst man sie erstmal :roll:

nat 4. Jun 2009 14:48

Re: wie benutze ich regular expressions?
 
ich habe auch vista. du kannst die alte hilfe nachinstallieren. gibt auf der microsoft seite dafür n download.
dann geht alles wieder wie früher. mußte ma n bisserl suchen.

edit: oh, war ganz einfach zu finden ;)
http://www.microsoft.com/downloads/d...DisplayLang=de

nimmersattXD 4. Jun 2009 15:04

Re: wie benutze ich regular expressions?
 
cool daran hab ich noch nie gedacht :wall:

naja aber jetzt hab ich ja dich hihi :cheers:


sry dass ich jetzt noch was hab :roll:

hab jetzt noch eingebaut dass er weitersucht, aber da kommt bei mir fehlermeldung nachdem er das erste gefunden hat!

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

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


//routine zum suchen der Url in den htmls

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

for i:=0 to LiBoSit.Count do
begin
   try
     page.LoadFromFile(LiBoSit.Items[i]);
     re.ModifierI:=true;
     re.ModifierG:=false;
     re.ModifierM:=false;
     re.ModifierS:=false;
     re.ModifierX:=false;
     re.Expression:='[img]([^[/img] 0 then filename:=copy(re.Match[1],idx+1,40)
         else filename:=re.match[1];
       LiBoPicsFoundInPages.Items[i]:=filename;
       such:=re.ExecNext
       until not re.ExecNext;
   finally
     page.Free;
     re.Free;
   end;
end;

end;
Fehlermeldung : "Access Violation at address 0000000. Read of address 0000000."

ich hab auch schon gegoogelt wie verrueckt aber nichts gefunden was mir geholfen hat.

nat 4. Jun 2009 15:49

Re: wie benutze ich regular expressions?
 
dein fehler dürfe hier liegen:
Delphi-Quellcode:
for i:=0 to LiBoSit.Count do
es muß
Delphi-Quellcode:
for i:=0 to LiBoSit.Count - 1 do
sein.
count gibt imemr die absolute anzahl an.
wenn z.B. count = 10, dann sind 10 elemente vorhanden.
da die zählung aber bei 0 beginnt hat das 10. element
den index 9.

nimmersattXD 4. Jun 2009 15:51

Re: wie benutze ich regular expressions?
 
hehe den fehler hab ich auch grad gefunden und gleich geaendert und das simekolon hinter such:=re.execnext hab ich auch angehaengt.


leider kommt die gleiche fehlermeldung immernoch!!


ich finds toll dass du mir so sehr hilfst, grosses dankeschoen!!

nat 4. Jun 2009 16:23

Re: wie benutze ich regular expressions?
 
tja, so müsst ich raten...
könnte noch daran liegen:
Delphi-Quellcode:
LiBoPicsFoundInPages.Items[i]:=filename;
hat die listbox denn schon sovielel emente? sonst mußte du
Delphi-Quellcode:
 LiBoPicsFoundInPages.Items.Add(filename);
machen.
wenn das nich geholfen hat, dann debugge deinen code mal und sage mir bei welcher
zeile genau der fehler kommt.

edit:
i.ü. ist das ziemlich ungünstig
Delphi-Quellcode:
filename:=copy(re.Match[1],idx+1,40)
was machste denn wenn du dateien hast die mehr als 40 zeichen haben?
besser du machst da was mit length(Match[1])

nimmersattXD 4. Jun 2009 16:30

Re: wie benutze ich regular expressions?
 
puuh jetzt kommt zwar die fehlermeldung immernoch, aber wenigstens fuellt sich meine listbox mit bildernamen *freu*

nahpets 4. Jun 2009 16:40

Re: wie benutze ich regular expressions?
 
Hallo,

Du hast am Ende einen Fehler in der Repeatschleife, du suchst da zweimal die nächste Übereinstimmung.
Delphi-Quellcode:
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,40)
    else filename:=re.match[1];
  LiBoPicsFoundInPages.Items[i]:=filename;
//  such:=re.ExecNext <-- der ist zuviel!!!
until not re.ExecNext;
eigentlich sollte
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;
reichen.

nat 4. Jun 2009 16:43

Re: wie benutze ich regular expressions?
 
hatte ich eben auch noch gesehen. aber eigentlich dürfte das keine zugriffsverletzung auslösen.
höchstens ne expception.

edit: und ich warte noch immer auf die zeile in der es knalle... :roll:

nimmersattXD 4. Jun 2009 16:45

Re: wie benutze ich regular expressions?
 
danke fuer den post, aber wenn ich das auskommentiere kommt meine fehlermeldung immernoch! :cry: menno


edit: achja das mit dem debuggen, wie mache ich das denn?

nahpets 4. Jun 2009 17:00

Re: wie benutze ich regular expressions?
 
Hallo,

einen habe ich noch:
Delphi-Quellcode:
for i:=0 to LiBoSit.Count do
bitte ändern in
Delphi-Quellcode:
for i:=0 to LiBoSit.Count - 1 do
Du greifst da regelmäßig auf einen nicht existierenden Eintrag zu.

nat 4. Jun 2009 17:02

Re: wie benutze ich regular expressions?
 
oh ha, du solltest ma n delphi-crashkurs machen... 8)
klicke links neben einer zeile auf den punkt oder was auch immer da is.
wenn die zeile sich einfärbt haste da n breakpoint gesetzt.
wenn dein programm dort ankommt hält es an. mit F7 bzw F8 kannst du schritt
für schritt durch deine anweisungen durch gehen. mit F9 läuft es wieder
normal weiter.

nimmersattXD 4. Jun 2009 19:53

Re: wie benutze ich regular expressions?
 
crash kurs?? ja :D mmh mein lehrer hatte mir das mal gezeigt, aba wusste nich das das so heißt :cyclops:


ok also der hat mit meinem loadfromfile am anfang der zählschleife probleme, da kommt dann die fehlermeldung, aber erst wenn die zählschleife bei 1 is, 0 macht sie komplett durch!

komisch weil der pfad eigentlich bei allen htmls ähnlich is :roll:

nat 4. Jun 2009 21:06

Re: wie benutze ich regular expressions?
 
du gibst page ja auch im ersten schleifen durchlauf mit free frei.
danach ist page kein object mehr und ein zugriff darauf gibt eine
zugriffsverletzung.

stell das in etwa so um:
Delphi-Quellcode:
page := TStringList.Create; //oder was page auch is, grad nich geguckt
try
  for i:=.....
  begin
  end;
finally
  page.free;
end;

nimmersattXD 4. Jun 2009 22:27

Re: wie benutze ich regular expressions?
 
klingt logisch und funst auch :D *freu* könnt dich knuddeln :cheer:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 Uhr.
Seite 1 von 2  1 2      

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