Avatar billede stry Nybegynder
06. august 2005 - 13:31 Der er 10 kommentarer og
2 løsninger

Uddrag navn og adresse fra htm-side

I forbindelse med spm. http://www.eksperten.dk/spm/637840 har jeg brug for noget kode som kan uddrage Navn, Adresse, Postnr. og By og gemme dem i 4 variabler som jeg kan arbejde videre med i mit VB6-projekt.
Følgende er et uddrag af den htm-side jeg downloader i mit VB6-projekt:

<!--a-->

    <tr>
      <td style="height: 2px;"></td>
    </tr>
    <tr>
      <td bgcolor="FFEC7D" align="right"><table width="609" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td><table border="0" cellspacing="0" cellpadding="0" >
                <tr>
                  <td style="height: 5px;"></td>
                  <td></td>
                  <td></td>
                </tr>
                <tr>

                <td align="left" valign="top">
               
                <strong><img alt="" src="../img/firma/ikoner/resultat-pil.gif" width="15" height="12"></strong></td>


                  <td align="left" valign="bottom"><h2 class="h2-seo navn">
            <!--m-->
           
           
FREDERIKSBERG BYGGEENTREPRISE A/S ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
           
            <!--n-->
                  </h2></td>
                  </tr>
                <tr>
                  <td style="height: 5px;"></td>
                  <td></td>
                  <td></td>
                </tr>
              </table></td>


  </tr>
  </table>
</td>
</tr>
<tr>
      <td bgcolor="FCF6C7" style="height: 4px;"></td>
    </tr>
    <tr>
      <td bgcolor="FCF6C7" align="right"><table border="0" cellpadding="0" cellspacing="0">
      <tr align="left" valign="top">
        <td style="width: 20px;"></td>
        <td style="width: 185px;"> <table border="0" cellspacing="0" cellpadding="0">
            <tr>
              <td align="left" valign="top" ><h3 class="h3-seo">GUNGEVEJ 2<br>¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
                2650&#32;HVIDOVRE</h3></td>¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
            </tr>
            <tr>
              <td style="height: 3px;"></td>
            </tr>
            <tr>
              <td><table border="0" cellspacing="0" cellpadding="0">
                  <tr>  </tr>
                </table></td>
            </tr>
          </table></td>
        <td style="width: 12px;"></td>
        <td style="width: 195px;"><table border="0" cellspacing="0" cellpadding="0" >
           
            <tr>
              <td style="width: 35px;">Tlf.:</td>
              <td><h3 class="h3-seo">33&nbsp;86&nbsp;20&nbsp;20<br></h3></td>
            </tr>
             
            <tr>
              <td>Fax:</td>
              <td><h3 class="h3-seo">33&nbsp;26&nbsp;27&nbsp;37<br></h3></td>
            </tr>
            </table>
          <table border="0" cellpadding="0" cellspacing="0">

linierne der indeholder de oplysninger jeg skal bruge er markeret med ¤¤¤¤¤¤¤-tegn, som altså ikke er en del af koden :-)
Det skal lige bemærkes at indholdet af den downloadede htm.-side varierer fra gang til gang.

Jeg håber at jeg har anskueliggjort problematikken og at der er nogen der kan hjælpe.

På forhånd tak.
Avatar billede roenving Novice
07. august 2005 - 04:08 #1
Er der de html-kommentarer i koden (<!-- m --> <!-- n --> ?-)
Avatar billede stry Nybegynder
07. august 2005 - 12:01 #2
Ja, det eneste jeg har tilføjet er ¤¤¤¤¤¤-tegnene.
Avatar billede roenving Novice
07. august 2005 - 13:50 #3
Måske kan det være noget i denne retning (jeg kender jo ikke vb-kommandoerne, så der må du hente hjælp i en passende kategori !-)

"^.*?<!--m-->\s*(.*?)\s*<!--n-->\s.*?<h3[^>]*>(.*?)<br>\s*(.*?)&#32;(.*?)<\/h3>.*"

I javascript eller f.eks. c# ville jeg have det som en variabel og så køre en replace på teksten og så have et array eller tekststreng med 4 variabler som resultat !o]


Hrm, jeg fik det først til at spille, da jeg opdelte det i to regexps, men der må du jo selv kæmpe med din vb-maskine (det var tydeligvis linjeskiftene, der lavede problemer !-)

var reg1 = /<!--m-->\s*(.*?)\s*<!--n-->/i;
var reg2 = /\s*.*?<h3[^>]*>(.*?)<br>\s*(.*?)&#32;(.*?)<\/h3>/i;
var opl = txt.match(reg1)[1];
var oplysninger = txt.match(reg2);
oplysninger[0] = opl;
alert(oplysninger);
Avatar billede stry Nybegynder
07. august 2005 - 15:26 #4
Ok...jeg har aldrig prøvet RegExp så det ser umiddelbart noget vanskeligt ud, men nu har jeg da noget at arbejde videre med.
Kan du give en lille forklaring på hvad det er der sker, så jeg selv kan bruge RegExp i forbindelse med andre htm-sider.
Avatar billede roenving Novice
07. august 2005 - 15:46 #5
Problemet er, at der er en del forskelle i implementeringer mellem de forskellige sprog, hvor jeg kun har forsøgt at arbejde med den slags i javascript og c#, dog er tegnbetydningen i høj grad ens på tværs af programmeringssprog, men ikke helt ...

-- i javascript er der f.eks. en speciel regexp-delimiter, nemlig // (svarende til f.eks. "" om strenge !-), som giver mulighed for direkte oprettelse af regexp-objekter inklusive modifiers ...

-- i vbscript har jeg set det med oprettelse af objektet med en dimensionering, en set-kommando til at initialisere det og så sætte pattern og modifiers på, ca. sådan:

dim reg as RegularExpression;
set reg = new RegExp()' -- jeg ved ikke om det hedder det ene eller det andet
reg.Pattern = ""^.*?<!--m-->\s*(.*?)\s*<!--n-->\s.*?<h3[^>]*>(.*?)<br>\s*(.*?)&#32;(.*?)<\/h3>.*"' -- måske skal der bruges \\ for \
reg.multiLine = True
reg.ignoreCase = True
nyTxt = reg.execute(txt)' -- denne er jeg heller ikke sikker på

-- men regulære udtryk har en hel masse tegn, som har special-betydning, her har jeg fra en ende af benyttet:

^$ start og slut på den tekst, som det regulære udtryk skal evalueres mod
. betyder et hvilketsomhelst tegn
* betyder at der skal være nul eller flere af det foregående tegn eller sekvens
? betyder non-greedy, de fleste regexp-implementationer er pr. definition greedy, dvs. de forsøger at lave et match, der er så langt som muligt, ved at bruge spørgsmålstegnet gøres det så kort som muligt
<!--m--> er bare den tekst som vi ved findes på et bestemt sted
\s betyder et whitespace, mellemrum, tab, linjeskift m.v.
() i regexpen etablere en gruppe, som ved match vil lave et selvstændigt match
-- til og med <h3 er det tidligere forklarede eller bogstavelige tegn
[^>]*> betyder så lang en tegnfølge, som muligt uden et >-tegn + tegnet, hvilket vil tage hele h3-tagget med inkl. attributter
-- så kommer en gruppe, som svarer til adressen, et linjeskift både html og i teksten, en ny gruppe for postnummeret, html-entiteten for mellemrum samt den sidste gruppe med bynavn !-)
Avatar billede stry Nybegynder
13. august 2005 - 17:49 #6
>>Roenving
Undskyld den lange svartid, men jeg har dels haft travlt på arbejde (det skal jo også passes :-))dels kæmpet med ovenstående problem.

Er det korrekt at den funktion du har lavet skal "fodres" med hele filen på en gang og ikke en linje ad gangen?
Avatar billede roenving Novice
13. august 2005 - 17:52 #7
Ja, men jeg ved ikke hvordan vb reagerer på sådanne tekst-variabler !-)
Avatar billede stry Nybegynder
13. august 2005 - 18:10 #8
Private Sub Command1_Click()
MsgBox (RegExpTest("^.*?<!--m-->\s*(.*?)\s*<!--n-->\s.*?<h3[^>]*>(.*?)<br>\s*(.*?)&#32;(.*?)<\/h3>.*", "H:\Temp.htm"))

End Sub
Function RegExpTest(patrn, strng1)
  Dim regEx, Match, Matches  ' Create variable.
  Dim Str, Str1, Fn As String
  Dim FNr As Integer
  Dim RetStr As String
  FNr = FreeFile
  Set regEx = New RegExp  ' Create a regular expression.
  regEx.Pattern = patrn  ' Set pattern.
  regEx.IgnoreCase = True  ' Set case insensitivity.
  regEx.Global = True  ' Set global applicability.
 
    Open strng1 For Input As #FNr
    Do While EOF(FNr) = False
        Line Input #FNr, Str1
        Str = Str & Str1 & vbLf
       
    Loop
    Set Matches = regEx.Execute(Str)  ' Execute search.
            For Each Match In Matches      ' Iterate Matches collection.
                 
                  RetStr = "Resultat: " & Match.Value
                Next
    Close #FNr
    'MsgBox Str
    RegExpTest = RetStr
End Function

Jeg har prøvet med ovenstående hvor "H:\Temp.htm" er den fil jeg har pastet i spgs., men det virker ikke.

Det gør det derimod hvis jeg prøver med:

Private Sub Command1_Click()
MsgBox (RegExpTest("Frederiksberg Byggeentreprise A/S", "H:\Temp.htm"))

Kan du gennemskue hvor det kikser?
Avatar billede roenving Novice
13. august 2005 - 18:14 #9
Nej, det kender jeg ikke vb godt nok til ...
Avatar billede stry Nybegynder
28. december 2005 - 12:26 #10
Roenving>>
Spørgsmålet blev løst på anden vis, men jeg vil gerne give dig point for din indsats hvis du smider et svar.
Avatar billede roenving Novice
28. december 2005 - 16:32 #11
Oki '-)
Avatar billede roenving Novice
03. januar 2006 - 16:52 #12
-- og tak for point ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester