[PHP] bepaalde Table rows uit broncode html filteren

Pagina: 1
Acties:
  • 156 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 15:34
goeie morgen!

Ik zit met een regular expression probleempje. Zoals gewoonlijk :)

de situatie:
Ik heb een hele lap aan broncode (HTML). Uit deze broncode wil ik een aantal table rows filteren en in een array zetten. Deze table rows zijn wel uniek binnen de HTML want ze dragen een class die de andere table rows niet hebben.

Nou ben ik bezig geweest met preg_replace_callback om de data eruit te krijgen. Maar het is me nog niet gelukt.

Tot hoever ik ben gekomen :
PHP:
1
2
3
4
5
6
7
function StoreTr( $input )
{
    print_r($input);
}

$string     = $_POST['broncode'];
$string     = preg_replace_callback("/(\\<TR class=\"trlb\"\>)(.*)(\\<\/tr\>)/U","StoreTr", $string);


Hij pikt gewoon simpelweg de table rows er niet uit.

Voorbeeld HTML:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                    <TR class="trlb">
                        <td class="coachtd">1</td>
                        <td class="coachtd">2</td>
                        <td class="coachtd">3</td>
                        <td class="coachtd">4</td>
                        <td class="coachtd" align="center">5</td>
                    </tr>
                    <TR class="trlb">
                        <td class="coachtd">1</td>
                        <td class="coachtd">2</td>
                        <td class="coachtd">3</td>
                        <td class="coachtd">4</td>
                        <td class="coachtd" align="center">5</td>
                    </tr>
                    <TR class="trlb">
                        <td class="coachtd">1</td>
                        <td class="coachtd">2</td>
                        <td class="coachtd">3</td>
                        <td class="coachtd">4</td>
                        <td class="coachtd" align="center">5</td>
                    </tr>


Natuurlijk heb ik GoT afgezocht maar ik kon geen bruikbare zoekresultaten vinden. Ook google was dit keer mijn vriend niet! Hopelijk kunnen jullie mij verder op weg helpen _/-\o_

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 20-09 23:58

TeeDee

CQB 241

Goeiemiddag! ;)

Je regexp pakt nu trdb, terwijl je code trlb aangeeft. Tikfout?
heb je regexp nog niet bekeken, maar dat is 't eerste wat me opviel

[ Voor 3% gewijzigd door TeeDee op 20-11-2007 12:58 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 16:52

Cyphax

Moderator LNX
Als je PHP5 hebt zou ik het doen met een XMLobjectje waar je HTML in kan laden. Dat zou het wat makkelijker maken allemaal want dan kan je je elementje er zo uitvissen en de boel gewoon parsen. Lijkt me minder foutgevoelig ook. :)

http://www.topxml.com/php...ent_function_loadhtml.asp
http://nl.php.net/manual/...-domdocument-loadhtml.php

Heb ik goede ervaringen mee. :)

[ Voor 14% gewijzigd door Cyphax op 20-11-2007 13:01 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 15:34
TeeDee schreef op dinsdag 20 november 2007 @ 12:58:
Goeiemiddag! ;)

Je regexp pakt nu trdb, terwijl je code trlb aangeeft. Tikfout?
heb je regexp nog niet bekeken, maar dat is 't eerste wat me opviel
je hebt gelijkt over trlb :) maar ook die zou er wat uit moeten filteren.
Cyphax schreef op dinsdag 20 november 2007 @ 13:00:
Als je PHP5 hebt zou ik het doen met een XMLobjectje waar je HTML in kan laden. Dat zou het wat makkelijker maken allemaal want dan kan je je elementje er zo uitvissen en de boel gewoon parsen. Lijkt me minder foutgevoelig ook. :)

http://www.topxml.com/php...ent_function_loadhtml.asp
http://nl.php.net/manual/...-domdocument-loadhtml.php

Heb ik goede ervaringen mee. :)
ik zal dat een proberen, alvast bedankt :)

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Heb je de s-modifier niet nodig om de . ook newlines te laten matchen:
s (PCRE_DOTALL)
If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded. This modifier is equivalent to Perl's /s modifier. A negative class such as [^a] always matches a newline character, independent of the setting of this modifier.

Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 15:34
Cyphax schreef op dinsdag 20 november 2007 @ 13:00:
Als je PHP5 hebt zou ik het doen met een XMLobjectje waar je HTML in kan laden. Dat zou het wat makkelijker maken allemaal want dan kan je je elementje er zo uitvissen en de boel gewoon parsen. Lijkt me minder foutgevoelig ook. :)

http://www.topxml.com/php...ent_function_loadhtml.asp
http://nl.php.net/manual/...-domdocument-loadhtml.php

Heb ik goede ervaringen mee. :)
Het werkt!

Alleen als ik de volle HTML erin gooi krijg ik allemaal errors zoals 'error parsing attribute name in Entity'.
Maar als ik alleen de <table> _data_ </table> erin gooi dan komt hij goed! dus ik ga alles behalve de Table tags eruit filteren.

Mijn oplossing:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    $htmlDoc = DOMDocument::loadHTML($htmlbroncode);
    $htmlDoc-> saveHTML();
    // haal de Table rows uit de broncode
    $trs        = $htmlDoc->getElementsByTagName("tr");
    $DataArray  = array();
    // gooi de table rows in een loop
    foreach( $trs as $TR )
    {
        if($TR->getAttribute('class') == "\\\"trlb\\\"") // bevat de table row wel de goede class
        {
            $TDs        = $TR->getElementsByTagName('td');
            $TDarray    = array();
            foreach( $TDs as $td ) // haal de TD's inclusief data uit de table rows
                $TDarray[] = $td->nodeValue;
            if( count($TDarray) == 5 ) // als de array 5 rijen bevat dan is hij legitiem
                $DataArray[]    = $TDarray;
        }
    }

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Moeten die twee backslashes voor <TR> niet 1 zijn?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 15:34
Grijze Vos schreef op dinsdag 20 november 2007 @ 14:09:
Moeten die twee backslashes voor <TR> niet 1 zijn?
nee, heel raar, de parser stripte die tag inclusief de backslach en dubbel quotes.

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 16:52

Cyphax

Moderator LNX
Het zou kunnen dat je parse errors krijgt als de HTML-structuur niet goed is van de bron. Als je een heel document inlaadt is die kans wel vrij groot natuurlijk. Mooi dat ie het doet met een losse tabel. Ik heb op diezelfde manier eerder een scriptje gemaakt die van een pagina (in mijn geval de tvgids) de html opvraagt en weer wegschrijft. :)

Saved by the buoyancy of citrus

Pagina: 1