Seite 1 von 2

Problem bei RegularExpressions

Verfasst: 26.07.2009 06:27
von KeyKon
Ich hoffe jemand von euch kennt sich gut damit aus, ich verzweifle hier schier...
Folgendes Problem:
Ich will mittel RegExp sämtliche Links einer Site einlesen, ich hab aber echt keinen Ansatz wie ich das bewerkstelligen soll, bisher hat mir ein Rummwurschteln mit den normalen Stringfunktionen gereicht, aber da ich mein Prog etwas Allroundfähiger gestalten will wäre das mit RegExp (denke ich) viel einfacher...

Es sollen also aus einem Quelltext alle <a href="link.htm"> rausgefischt werden, allerdings is HTML in der gestaltung ja leider sehr frei es muss also auch mit soetwas klarkommen <a href = ein/link.php > oder sowas <a style='was weis ich' href = 'www.seite.de' target='muh'>

Naja, ich hoffe ihr wisst was ich mein, vll hat ja jemand sogar schon sowas in der Art in der Schublade...
Hier ein Code aus der Hilfe wo man (glaube ich) nurnoch die richtige RegExpression einsetzen muss:

Code: Alles auswählen

site$ = "<html><head></head><body><p>text<a href = 'www.link.de'>blalabla</a></p><br /><a href= relativer.link target=_blank>dicht</a><a href="+Chr(34)+"link/link/weiter.php"+Chr(34)+" style='kA'>Muuh</a></body></html>";GetClipboardText()

If CreateRegularExpression(0, "???")

  Dim Result$(0)
  
  a = ExtractRegularExpression(0, site$, result$())
  
  MessageRequester("Info", "Nb strings found: "+Str(a))
  
  For k=0 To a-1
    MessageRequester("Info", Result$(k))
  Next

Else
  MessageRequester("Error", RegularExpressionError())
EndIf
Ergebniss sollte dann sowas in der Art sein:
www.link.de
relativer.link
link/link/weiter.php
THX schonmal im voraus...

Verfasst: 26.07.2009 10:02
von Kevin
ich habe es jetzt mal mit den string befehlen gemacht

Code: Alles auswählen

site$ = "<html><head></head><body><p>text<a href = 'www.link.de'>blalabla</a></p><br /><a href= relativer.link target=_blank>dicht</a><a href="+Chr(34)+"link/link/weiter.php"+Chr(34)+" style='kA'>Muuh</a></body></html>";GetClipboardText() 

pos=0
Repeat
 find = FindString(site$, "href", position)
 position = find + 1
  
  If find
   pos = FindString(site$, "=", position) + 1
   find = FindString(site$,">", pos)
   find$ = Trim(Mid(site$,pos,find-pos))

   pos = FindString(find$, "'", 0)
   posb = FindString(find$, Chr(34), 0)
   
   Debug find$+" <<<<< mit "+Chr(34)+" und ' "
   
     If pos And (pos<posb Or Not posb) : pos + 1
      find = FindString(find$, "'", pos+1)
      find$ = Mid(find$, pos, find-pos)
     EndIf
   
     If posb And (posb<pos Or Not pos) : posb + 1
      find = FindString(find$, Chr(34), posb+1)
      find$ = Mid(find$, posb, find-posb)
     EndIf
   
   Debug find$
  EndIf

Until Not find

Verfasst: 26.07.2009 10:59
von cxAlex
Hier noch eine Methode mit String-Parsen:

Code: Alles auswählen

site$ = "<html><head></head><body><p>text<a href = 'www.link.de'>blalabla</a></p><br /><a href= relativer.link target=_blank>dicht</a><a href=" + Chr(34) + "link/link/weiter.php" + Chr(34) + " style='kA'>Muuh</a></body></html>";GetClipboardText()

Define *Char.Character, tText$
*Char = @site$

While *Char\c
  If *Char\c = '<'
    *Char + SizeOf(Character)
    tText$ = ""
    While ((*Char\c< = 'z') And (*Char\c> = 'a')) Or ((*Char\c< = 'Z') And (*Char\c> = 'A'))
      tText$ + Chr(*Char\c)
      *Char + SizeOf(Character)
    Wend
    tText$ = LCase(tText$)
    If *Char\c<>'>'
      If tText$ = "a" ; Tag finden
        Repeat
          *Char + SizeOf(Character)
        Until ((*Char\c< = 'z') And (*Char\c> = 'a')) Or ((*Char\c< = 'Z') And (*Char\c> = 'A')) Or (*Char\c = '>') Or (Not *Char\c)
        If *Char\c And (*Char\c<>'>')
          tText$ = ""
          While ((*Char\c< = 'z') And (*Char\c> = 'a')) Or ((*Char\c< = 'Z') And (*Char\c> = 'A'))
            tText$ + Chr(*Char\c)
            *Char + SizeOf(Character)
          Wend
          tText$ = LCase(tText$)
          If tText$ = "href" ; Attribut finden
            Repeat
              *Char + SizeOf(Character)
            Until ((*Char\c< = 'z') And (*Char\c> = 'a')) Or ((*Char\c< = 'Z') And (*Char\c> = 'A')) Or (*Char\c = 39) Or (*Char\c = '"') Or (*Char\c = '>') Or (Not *Char\c)
            tText$ = ""
            
            ; Link filtern
            If *Char\c = 39
              *Char + SizeOf(Character)
              While (*Char\c<>39) And *Char\c
                tText$ + Chr(*Char\c)
                *Char + SizeOf(Character)
              Wend

              Debug tText$
              
            ElseIf *Char\c = '"'
              *Char + SizeOf(Character)
              While (*Char\c<>'"') And *Char\c
                tText$ + Chr(*Char\c)
                *Char + SizeOf(Character)
              Wend
              Debug tText$
              
            ElseIf *Char\c And (*Char\c<>'>')

              While ((*Char\c< = '9') And (*Char\c> = '0')) Or ((*Char\c< = 'z') And (*Char\c> = 'a')) Or ((*Char\c< = 'Z') And (*Char\c> = 'A')) Or (*Char\c = '.') Or (*Char\c = '/') Or (*Char\c = '\')
                tText$ + Chr(*Char\c)
                *Char + SizeOf(Character)
              Wend
              
              Debug tText$
            EndIf
          EndIf
        EndIf
      EndIf
    EndIf
  EndIf
  *Char + SizeOf(Character)
Wend

Verfasst: 26.07.2009 11:38
von DrShrek
Hier eine erste Variante mit RegEx (Unvollständig!):

Code: Alles auswählen

site$ = "<html><head></head><body><p>text<a href = 'www.link.de'>blalabla</a></p><br /><a href= relativer.link target=_blank>dicht</a><a href="+Chr(34)+"link/link/weiter.php"+Chr(34)+" style='kA'>Muuh</a></body></html>";GetClipboardText() 

If CreateRegularExpression(0, "href.*?=*>")
  Dim Result$(0)
  NbFound = ExtractRegularExpression(0, site$, Result$())
  For k = 0 To NbFound-1
    Debug Result$(k) 
  Next
Else
  Debug RegularExpressionError()
EndIf

Verfasst: 27.07.2009 01:43
von KeyKon
Mh, cxAlex Lösung Funktioniert gut und schnell...
Nur Zahlen im Link scheinst du nicht zu berücksichtigen, aber das ist ja leicht zu Ergänzen ( Or ((*Char\c< = '9') And (*Char\c> = '0')))...

Verfasst: 08.08.2009 00:06
von .:M:.
Ich will auch mitmachen :twisted:

Code: Alles auswählen

site$ = "<html><head></head><body><p>text<a href = 'www.link.de'>blalabla</a></p><br /><a href= relativer.link target=_blank>dicht</a><a href="+Chr(34)+"link/link/weiter.php"+Chr(34)+" style='kA'>Muuh</a></body></html>";GetClipboardText() 

For i=1 To CountString(site$,"<")+1
  link$=StringField(site$, i, "<")
  If FindString(link$, "href", 1)
    link$=StringField(link$, 2, "=")
    link$=StringField(link$, 1, ">")
    link$=Trim(link$) 
    If FindString(link$, " ", 1)
      link$=StringField(link$, 1, " ")
    EndIf  
    Debug link$
  EndIf   
Next i

Verfasst: 08.08.2009 02:46
von Thalius

Verfasst: 08.08.2009 03:02
von edel
OT:
Na der Thread war lustig, ein offensichtlichen Fehler im Regexp Ausdruck und
es dann auf die Lib schieben... Aber nochmal an IceSoft, das einzige was
verbugt ist oder war, ist die PB Lib selber. Die Regex Lib mag vielleicht auch
ihre Fehler haben, aber solch einen Bug hast du sicherlich noch nicht
gefunden. Also kein Grund hier nach einem Update zu schreien..

Verfasst: 08.08.2009 05:44
von DrShrek
edel hat geschrieben:Also kein Grund hier nach einem Update zu schreien..
Doch. Das die Lib die bei PB mitgeliefert wird von 2007 ist, ist schon Grund genug.

Verfasst: 08.08.2009 12:54
von mk-soft
Quelle http://expat.sourceforge.net/
News

5 June 2007, Expat 2.0.1 released.

Release 2.0.1 of the Expat XML parser is a bugfix release resolving both code and build related issues. Changes include: