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?
    "My software never has bugs, it just develops random features."
    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"


  • #2
    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?
    http://hallophp.de

    Kommentar


    • #3
      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
      "My software never has bugs, it just develops random features."
      "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

      Kommentar


      • #4
        Siehe [edit]
        http://hallophp.de

        Kommentar


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

          Kommentar


          • #6
            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!
            "My software never has bugs, it just develops random features."
            "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

            Kommentar


            • #7
              Schau dir mal den Modifier s an.
              http://hallophp.de

              Kommentar


              • #8
                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.
                "My software never has bugs, it just develops random features."
                "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                Kommentar


                • #9
                  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.
                  http://hallophp.de

                  Kommentar


                  • #10
                    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.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      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
                      "My software never has bugs, it just develops random features."
                      "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                      Kommentar


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

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar

                        Lädt...
                        X