Avatar billede _eksperten_ Nybegynder
23. maj 2007 - 17:50 Der er 9 kommentarer og
1 løsning

RegExp til at hente flere vars fra html

Hej Eksperter!

Jeg prøvet at hente flere variable ud fra hver match fra regexp. Følgende er hvad jeg har prøvet:

class="label">Run.*<td.*>(*.?)</td><td.*>(*.?)</td><td.*>(*.?)</td>.*</tabel>

(har aldrig rigtig rodet med regexp før, hehe)

Og siden jeg henter fra er bygget op på følgende manér:

blablabla (en masse ligegyldigt html - skal springes over)
<!-- hoved start -->
bla
<th class="label">Run</th>
bla
<!-- hoved slut -->
bla
<table><tr>
bla
    <td bla>Navn1</td>
    <td bla>Efternavn1</td>
    <td bla>Adresse1</td>
bla
</tr></table>
bla
<!-- hoved start -->
bla
<th class="label">Res</th>
bla
<!-- hoved slut -->
bla
<table><tr>
bla
    <td bla>Navn2</td>
    <td bla>Efternavn2</td>
    <td bla>Adresse2</td>
bla
</tr></table>
bla
<!-- hoved start -->
bla
<th class="label">Run</th>
bla
<!-- hoved slut -->
bla
<table><tr>
bla
    <td bla>Navn3</td>
    <td bla>Efternavn3</td>
    <td bla>Adresse3</td>
bla
</tr></table>

bla = noget som skal springes over..

Her prøver jeg at hente (Navn1, Efternavn1, Adresse1) og (Navn3, Efternavn3, Adresse3)
Avatar billede roenving Novice
23. maj 2007 - 22:50 #1
Du har i hvert fald ikke forstået syntaksen korrekt, for du bytter ret konsekvent om på antal og betingelse, og samtidig ser det ud til, at du bruger for lidt ungreedy-ting:

class="label">Run.*?<td.*?>(.*?)</td><td.*?>(.*?)</td><td.*?>(.*?)</td>.*?</tabel>

.*? betyder find så mange tegn af en hvilkensomhelst slags indtil det efterfølgende opdages ...

-- uden spørgsmålstegnet betyder det find så mange som muligt, indtil det ikke længere er muligt at finde det efterfølgende ...

-- og så nævnte jensgram den anden dag, at det er bedre at søge efter ikke-forekomst af et tegn i stedet for at være ungreedy, og der tror jeg han har fat i noget rigtigt, så måske:

class="label">Run.*?<td[^>]>(.*?)</td><td[^>]>(.*?)</td><td[^>]>(.*?)</td>.*?</tabel>
Avatar billede roenving Novice
23. maj 2007 - 22:51 #2
Ups ...

class="label">Run.*?<td[^>]*>(.*?)</td><td[^>]*>(.*?)</td><td[^>]*>(.*?)</td>.*?</tabel>
Avatar billede _eksperten_ Nybegynder
24. maj 2007 - 15:25 #3
Du har ret, jeg har nok være lidt for hurtig til at læse den regexp guide :)

Jeg har prøvet lidt frem og tilbage, men det virker ikke..

Hvis jeg kun ønsker at få Run og Navn1 med som variabel, prøver jeg følgende:

<th class="label">(.*?)</th>[^*]*<td[^>]*>(.*?)</td>

Run fåes, men ikke Navn1 derimod Adresse1

I testeksemplet er der ingen * derfor kan jeg bruge [^*]*, men jeg kan sagtens støde på * når det skal bruges i praksis.  ".*?" får jeg ikke til at virke.
Avatar billede _eksperten_ Nybegynder
24. maj 2007 - 16:03 #4
Når jeg så fjerner linieskift fra koden virker

<th class="label">(.*?)</th>.*?<td[^>]*>(.*?)</td>

efter planen. Det er vidst fordi \n ikke understøttes i "."

Hvordan får jeg rettet på på det? Så teksten stadig kan indeholde \n.

Der er selvfølgelig stadig den mulighed at fjerne \n fra teksten før processing, men kan det ikke gøres vha. regexp?
Avatar billede _eksperten_ Nybegynder
24. maj 2007 - 16:39 #5
Så fandt jeg frem til noget der kan bruges:

<th class="label">Run[\s\S]*?<td[^>]*>(.*?)</td>[\s\S]*?<td[^>]*>(.*?)</td>[\s\S]*?<td[^>]*>(.*?)</td>[\s\S]*?</table>

[\s\S] - svarer til "." inklusiv newline/tabs osv.

Kan det gøres på en anden måde? Kan man evt bruge OR "|" ??

Noget i stil med .|\x0a  ?

Roenving, tak for hjælpen, du må meget gerne smide et svar.
Avatar billede _eksperten_ Nybegynder
24. maj 2007 - 17:10 #6
Har lige et sidste spørgsmål. Hvis nu siden varierer en smule i opbygning, så den til tider er bygget op således:

<!-- hoved start -->
bla
<th class="label">Run</th>
bla
<!-- hoved slut -->

bla

<table>
<tr>

bla

    <td bla>Navn1</td>
    <td bla>Efternavn1</td>
    <td bla>Adresse1</td>

bla

</tr>
<tr>

    <td bla>Ekstra1_1</td>
    <td bla>Ekstra1_2</td>
    <td bla>Ekstra1_3</td>

</tr>

</table>

bla


Kan det da lade sig gøre at hente Ekstra1_1, Ekstra1_2 og Ekstra1_3 ud også?
Avatar billede _eksperten_ Nybegynder
26. maj 2007 - 12:13 #7
Jeg har løst "problemet" ved at udføre 2xRegExp:

Run[\s\S]*?<table>([\s\S]*?)</table>  og
<td[^>]*>(.*?)</td>[\s\S]*?<td[^>]*>(.*?)</td>[\s\S]*?<td[^>]*>(.*?)</td>

Ved ikke om det er den bedste måde at gøre det på!?

Roenving> Smid et svar, så du kan få dine point :)
Avatar billede roenving Novice
26. maj 2007 - 22:31 #8
Oki '-)
Avatar billede _eksperten_ Nybegynder
27. maj 2007 - 13:37 #9
Kan du give mig et svar på det ovenstående? Er det den eneste mulighed at gøre det over 2 omgange eller kan det laves i et enkelt regexp? :)
Avatar billede roenving Novice
28. maj 2007 - 09:28 #10
Jeg er ikke sikker, men det kunne være, at du kunne bruge:

Run[\s\S]*?<table>(<td[^>]*>(.*?)</td>[\s\S]*?<td[^>]*>(.*?)</td>[\s\S]*?<td[^>]*>(.*?)</td>)*</table>

-- men det kan være svært at finde rundt i variablerne (som der vist også kun må defineres 9 af !-)

-- els 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