lorenz: mit "preg_match_all" tabelleninhalt von externer stelle auslesen

Hallo,

Ich weiss, dieses thema gab schon mal, aber ich kriegs einfach nicht gebacken, so wie ich mir das vorstelle. vielleicht erweist sich jemand gnädig und hilft mir auf die sprünge.

ich versuche gerade eine tabelle aus einer anderen webseite herauszuholen, wobei ich die daten in ein mehrdimensionales array schreiben will, in dem für jede tablerow ein array erstellt wird, welches dann die einzelnen zellenwerte beinhaltet.

meine vorgangsweise bis jetzt:
ich ziehe mir mit preg_match und einem keyword das davor steht, die richtige tabelle aus der datei und speicher sie in $tabelle

  
$daten = file_get_contents('input.php');  
  
preg_match(  
    '/keyword<\/th><\/tr>(?>\s*<tr>(?>\s*<td[^>]*><?[^<]*<?[^<]*<\/td>)*\s*<\/tr>)*/iu',  
    $daten,  
    $tabelle  
);  

danach sortiere ich mal die einzelnen tablerows in ein array mit preg_match_all..

  
preg_match_all(  
 '/<tr>\s*(<td[^>]*>.*<\/td>\s*)*<\/tr>/siU',  
 $tabelle[0],  
        $werte2,  
 PREG_PATTERN_ORDER  
);  

$werte2[0] enthält dann die einzelnen reihen, jedoch mit allen tags noch und noch nicht in einzelne tabelleninhalte zerlegt.
deswegen hab ich jetzt versucht nochmal ein preg_match_all drüberlaufenzulassen:

  
preg_match_all(  
  '~<td[^>]*>(.*?)<\/td>~',  
  $werte2[0][0],  
  $ausgabe,  
  PREG_PATTERN_ORDER  
);  

damit liest er mir die erste tabellenreihe aus und schreibt ins array ausgabe[0] den Zellen mit den td tags und in ausgabe[1] nur den Zelleninhalt. jedoch macht er es immer nur für eine tabellenreihe, gebe ich $werte2[0] an, macht er mir gar nix. als ergebnis hätte ich gern ein array, dass in der art aufgebaut ist:

Array
(
    [0] => Array
        (
            [0] => zelleinhalt 1 von reihe 1
            [1] => zelleinhalt 2 von reihe 1
            [2] => zelleinhalt 3 von reihe 1
        )

[1] => Array
        (
            [0] => zelleinhalt 1 von reihe 2
            [1] => zelleinhalt 2 von reihe 2
            [2] => zelleinhalt 3 von reihe 2
        )
)

ist das so wie ich das angehe, der richtig weg? über tips würd ich mich freuen.

gruss, lorenz

  1. Hi,

    preg_match_all(
      '~<td[^>]>(.?)</td>~',
      $werte2[0][0],
      $ausgabe,
      PREG_PATTERN_ORDER
    );

    
    >   
    > damit liest er mir die erste tabellenreihe aus und schreibt ins array ausgabe[0] den Zellen mit den td tags und in ausgabe[1] nur den Zelleninhalt. jedoch macht er es immer nur für eine tabellenreihe, gebe ich $werte2[0] an, macht er mir gar nix.  
      
    Kann "er" ja auch nicht.  
    Derzeit gibst du $werte[0][0] an, was wohl ein Textstring ist.  
    Wenn du stattdessen $werte[0] angibst, was ein Array ist, muss dieses in einen String konvertiert werden, damit preg\_match\_all damit arbeiten kann. Arrays in Strings konviertiert ergeben in PHP aber nur den Text "Array" - da drin kannst du lange nach "<td..." suchen.  
      
    Aber wie man eine Aufgabe, die man einmal ausgefuehrt hat, mehrmals ausfuehrt, davon hast du doch bestimmt schon gehoert? Das Stichwort lautet Schleife.  
      
    MfG ChrisB  
      
    
    -- 
    „This is the author's opinion, not necessarily that of Starbucks.“
    
  2. Hi,

    preg_match_all(
      '~<td[^>]*>(.*?)</td>~',
      $werte2[0][0],
      $ausgabe,
      PREG_PATTERN_ORDER
    );

    im Prinzip passt das doch, mit
    $str    =  "<table>
                    <tr><td>Das ist ein <strong>fettes</strong> Brot!</td><td>das ist ein <i>schönes</i> Ding</td></tr>
                    <tr><td>Das ist ein <strong>starkes</strong> Stück!</td><td>das ist eine <i>alte</i> Nudel</td></tr>
                </table>";

    $regex  =  "#(<tr>)?<td>(.+?)</td>#";
    preg_match_all ($regex, $str, $match);
    print_r ($match) ;

    bekommst Du diese Ausgabe
    Array
    (
        [0] => Array
            (
                [0] => <tr><td>Das ist ein <strong>fettes</strong> Brot!</td>
                [1] => <td>das ist ein <i>schönes</i> Ding</td>
                [2] => <tr><td>Das ist ein <strong>starkes</strong> Stück!</td>
                [3] => <td>das ist eine <i>alte</i> Nudel</td>
            )

    [1] => Array
            (
                [0] => <tr>
                [1] =>
                [2] => <tr>
                [3] =>
            )

    [2] => Array
            (
                [0] => Das ist ein <strong>fettes</strong> Brot!
                [1] => das ist ein <i>schönes</i> Ding
                [2] => Das ist ein <strong>starkes</strong> Stück!
                [3] => das ist eine <i>alte</i> Nudel
            )

    Anhand der gefundenen tr's kannst Du jetzt die td's per row ausrechnen und Dein Array umsortieren...

    Gruesse, Joachim

    --
    Am Ende wird alles gut.