Avatar billede gnyff Nybegynder
04. maj 2007 - 22:26 Der er 12 kommentarer

Find table og indhold

Hej Eksperter

Jeg er kommer i et lille problem, nok pga. min manglene forståelse på reg.exp.

Jeg skal have trukket en tabel ud fra en side, men efter adskildige forsøg er det stadig ikke lykkes mig...

Er det ikke rigtigt forstået at denne kommando skulle trække alt ud der står mellem <td> og /td>?

if(preg_match_all("'<td (.*?)+\/td>+'si",$str,$output)){
    print_r($output);
    echo "<br>\n";
}

Håber i kan hjælpe mig med at få det til at fungere
Avatar billede jensgram Nybegynder
05. maj 2007 - 09:21 #1
Hmm, det ligner, at der er et par syntaksfejl. Hvad med:

if(preg_match_all("'<td>(.*?)/td>'si",$str,$output)){
    print_r($output);
    echo "<br>\n";
}
Avatar billede gnyff Nybegynder
05. maj 2007 - 10:04 #2
Det hjalp... men så er mit spørgsmål... hvad betyder ? for jeg har læst og læst, men har ikke kunne få noget ud af det.

Hvad er forskælden mellem .* og .*?

Jeg ved at .* betyder alt, men hvad skal ? så gøre?

Videre til næste spørgsmål :o)

Dvs. at jeg ville kunne fange en tabel ved at skrive
preg_match_all("'<table(.*?)/table>+'si",$str,$output))

Og hvis jeg vil have det bliver en bestemt tabel ved at skrive
preg_match_all("'<table .*><tr.*><td.*>Jeg ved hvad der står.*<.*\/tr.*>.*(.*?)/table>+'si",$str,$output))
Avatar billede roenving Novice
05. maj 2007 - 15:10 #3
Normalt matcher en RegExp 'greedy', dvs. at den finder så lang en match som muligt ...

-- med spørgsmålstegnet på, indstilles matchingen til at være ungreedy, dvs., den stopper første gang, den efterfølgende tekst kommer, uden stopper den sidste gang det forekommer !-)

<table><tr>
  <td>Her er en celle</td>
  <td>Her er en celle til</td>
</tr></table>

Greedy match:

Her er en celle</td>
  <td>Her er en celle til

Ungreedy match:

Her er en celle

og

Her er en celle til
Avatar billede gnyff Nybegynder
14. maj 2007 - 19:54 #4
Ahh... det vil sige at hvis jeg vil have fat i en tabel skal jeg skrive:

preg_match_all("/<tr.*><td.*>(.*?)<\/td.*><\/td.*>/si")

så får jeg alt hvad der er inden for <td> og til </td>?
Avatar billede roenving Novice
14. maj 2007 - 19:59 #5
Du skal nok også gøre de andre ungreedy:

preg_match_all("/<td.*?>(.*?)<\/td.*?>/si")

-- og så kan der jo sagtens være flere td'er i en tr, så du skal nok nøjes med at søge efter selve td'en !-)
Avatar billede gnyff Nybegynder
14. maj 2007 - 20:09 #6
Jeg skal hente en stilling og ved hvad det første i tabellen er... men jeg skal hente resten af dataen...

Gør jeg ikke det ved at skrive preg_match_all("'.*<table.*>.*Pulje.*(<td.*>(.*?)<\/td.*>).*<\/table>'si",$data);
Avatar billede roenving Novice
14. maj 2007 - 20:27 #7
Der må jeg blive dig svar skyldig, for jeg kender ikke preg_match_all-funktionens måde at gøre det på ...

-- måske jensgram eller en i php-kategorien kan svare !-)
Avatar billede gnyff Nybegynder
14. maj 2007 - 20:50 #8
Nu var det mester reg.exp jeg tænkte på :o)Men table optræder kun en gang, og td og tr flere gange... kan man ikke få fat i dem ved at skrive <table.*>(<tr.*><td.*>(.*?)<\/td><\/tr>)*<\/table>?
Avatar billede gnyff Nybegynder
14. maj 2007 - 20:51 #9
... hov... og ind til videre mange tak for hjælpen, du skal nok få en bid af kagen når jeg lige har fået det sidste ind :o)
Avatar billede jensgram Nybegynder
14. maj 2007 - 22:00 #10
Jo, du kan gøre noget á la det skitserede med preg_match_all - du skal blot lure din "matches"-reference bagefter:

preg_match_all('/<table[^>]*>(<tr[^>]*><td[^>]*>(.*?)<\/td><\/tr>)+<\/table>/', $data, $matches);

Prøv så

var_dump($matches);


Kan der være flere <td>-</td> par i en <tr>, så skal vi nok:

preg_match_all('/<table[^>]*>(<tr[^>]*>(<td[^>]*>(.*?)<\/td>)+<\/tr>)+<\/table>/', $data, $matches);


Ved ikke helt om det var svar på noget som helst :)
Avatar billede gnyff Nybegynder
18. maj 2007 - 22:22 #11
OK... jeg har ikke helt forstået hvad [^>] gør efter som hver af en tr eller td jo slutter med det...

Nå men jeg skal jo kun have fat i dataen fra tabellen og ikke tabellen selv... så er det rigtigt forsået at jeg skal skrive:
<table[^>]*>(<tr[^>]*>(<td[^>]*>(.*?)<\/td><td[^>]*>([0-9])<\/td><td[^>]*>([0-9])<\/td><td[^>]*>([0-9])<\/td><td[^>]*>([0-9])<\/td><td[^>]*>([0-9])<\/td>)+<\/tr>)+<\/table>/si

Altså først skal jeg have fat i holdnavnet... dvs (.*?) og bagefter i alle tallende der høre til det inden der kommer en tr mere... det gør jeg ved at skrive ([0-9])... er det ikke sådan jeg skal gøre det?
Avatar billede jensgram Nybegynder
19. maj 2007 - 12:31 #12
<table[^>]*> er bare en mere effektiv måde at skrive <table.*?> på.
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