Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] falsche Ausgabe Reg. Ausdruck - preg_match_all daher leer

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] falsche Ausgabe Reg. Ausdruck - preg_match_all daher leer

    Moin Moin, ich hab ein kleines Problem.
    Ich hab aus einer alten Seite einige HTML-Tabellen, die alle hintereinander angelegt sind. Haben auch alle den gleichen Aufbau:

    Code:
    <table cellpadding="3">
        <tbody>
             <tr><td>1.</td><td>Name1</td><td>Vereinsname</td><td>3  Punkte</td></tr>
             <tr><td>2.</td><td>Name2</td><td>Vereinsname</td><td>3  Punkte</td></tr>
        </tbody>
    </table>
    <table cellpadding="4">
        <tbody>
             <tr><td>1.</td><td>Name1</td><td>Vereinsname</td><td>6  Punkte</td></tr>
             <tr><td>2.</td><td>Name2</td><td>Vereinsname</td><td>5  Punkte</td></tr>
             <tr><td>3.</td><td>Name3</td><td>Vereinsname</td><td>4.5  Punkte</td></tr>
        </tbody>
    </table>
    Da es verdammt viele Tabellen sind und ich keinen Bock habe alles per Hand zu machen würde ich gerne das ganze einmal automatisiert auslesen und in eine DB eintragen.

    Ich habe das ganze rauskopiert und einfach mal in eine Variable geschrieben und wollte dann mit einem regulären Ausdruck das ganze Stück für Stück aufbröseln.

    Mein Code sieh so aus:
    PHP-Code:
    <?php
    error_reporting
    (-1);

    $var '...';    // hier stehen meine Tabellen drin. 
                     // Um den Text zu verkürzen habe ich es weggelassen

    $matches = array();
    $start '<table(.*?)>';  // Auch probiert mit:  '\<table(.*?)\>'
    $end   '<\/table>';
    $pattern '!' $start '(.*)' $end '!';
    echo 
    $pattern.'<br />';   // Ausgabe: !(.*)<\/table>!
    preg_match_all($pattern$var$matches);
    var_dump($matches);       // Keine Treffer, ist ja aber auch klar.

    ?>
    So hat zufällig jemand ne Idee, warum meine Pattern abgeschnitten dargestellt werden? Oder habe ich einfach einen Fehler im regulären Ausdruck?

  • nikosch
    antwortet
    Wenn die Tabellen konsistent sind, könnte man ansonsten einfach <td> capturen. Und hinterher Gruppenbruch benutzen.

    Einen Kommentar schreiben:


  • Paul.Schramenko
    antwortet
    Das HTML ist valide. Also ich hab eine Lösung gefunden. Ist aber eher ein Workaround, ich poste ihn aber mal der Vollständigkeit halber:

    PHP-Code:
    $var str_replace(array("\r""\n""\r\n"), ''$var);
    $replacements = array(
                       
    "#\s\s+#"      => ' ',
                       
    "/<\/table>/s" => '[:SPLIT:]',
                       
    "/<table>/s"   => '',
                    );
    $var preg_replace(array_keys($replacements), array_values($replacements), $var);
    $var explode('[:SPLIT:]'$var);

    unset(
    $var[count($var)-1]); 
    Wobei mir die Lösung eigentlich nicht gefällt. Ich mein ich werde das Script eh nur einmal ausführen um die DB zu befüllen, aber mache es dann doch lieber mit DOM denke ich

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Nur leider ist dass nicht mein erwartetes Ergebnis, ich bin eigentlich davon ausgegangen, dass die <tr>...</tr> einer Tabelle in einzelnen Array-Elementen auftauchen,
    Quantifizieren und Capturing geleichzeitig funktioniert nicht. Insofern Dein HTML valide ist, sollstest Du auf jeden Fall DOM verwenden.

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Das habe ich aber nicht mit dem s-Modifier gemeint: http://php.net/manual/de/reference.p....modifiers.php.

    Du musst jetzt zusätzlich noch die Gier umkehren. Das kannst du mit dem Modifier U oder einem Fragezeichen hinter deinem Quantifier (*) erreichen.

    Eventuell ist für dich auch noch der 4. Parameter von preg_match_all interessant. Dieser erlaubt eine andere Sortierung der Fundstellen.

    Einen Kommentar schreiben:


  • Paul.Schramenko
    antwortet
    PHP-Code:
    $start '<table(.*?)>';
    $end   '<\/table>';
    $pattern '!' $start '((\s|.)*)' $end '!'
    geiler Tipp danke.
    Nur leider ist dass nicht mein erwartetes Ergebnis, ich bin eigentlich davon ausgegangen, dass die <tr>...</tr> einer Tabelle in einzelnen Array-Elementen auftauchen, stattdessen habe ich alle Tables in einem.

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Schau dir mal den Modifier s an.

    Einen Kommentar schreiben:


  • Paul.Schramenko
    antwortet
    Doh!
    Code:
    !<table(.*?)>(.*)<\/table>!
    Ok es steht also richtig drin... Hätte ich eigentlich auch selbst drauf kommen müssen. jemand ne Idee warum derr reg. Ausdruck nicht funktioniert?


    Vielen Dank für die promte Hilfe!

    Einen Kommentar schreiben:


  • draco88
    antwortet
    Schau dir am besten mal den Quelltext(von der HTML Ausgabe) an, ich könnt Wetten, da wird der fehlende Text drinne stehen

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Siehe [edit]

    Einen Kommentar schreiben:


  • Paul.Schramenko
    antwortet
    ups also die Escape zeichen stammen von zweiten versuch.
    Habe es auch so dierekt zusammen gefrämelt versucht, hat ebenso wenig funktioniert.

    Also die Ausgabe bei eingebenen Beispiel ist diese:
    Code:
    !(.*)<\/table>!
    Tschuldigung nochmal!

    Hmm mit dem DOMDocument kann ich mal heute Abend probieren. Aber eigentlich sollte das ganze ja auch mit preg_match_all gehen. Oder habe ich irgendwo syntaktischen Käse prodoziert?

    Nachtrag:
    Habe mal fix den Fehler oben beseitigt, damit keine verwirrung beim Lesen auftritt

    Einen Kommentar schreiben:


  • Asipak
    antwortet
    Sieht merwürdig aus, stimmt.

    // Ausgabe: !\(.*)\<\/table\>!
    Woher stammen denn die escape-Zeichen? Oder hast du diese bei einem anderen Versuch hinzugefügt?

    Funtkioniert es denn, wenn du den Ausdruck direkt in eine Variable schreiben und auf den Verkettungsoperator verzichten würdest?

    Wie wäre es hiermit? PHP: DOM - Manual

    [edit]

    achso: Hast du mal in den Browserquelltext geschaut?

    Einen Kommentar schreiben:

Lädt...
X