Quellcode filtern (regex?)

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

  • Quellcode filtern (regex?)

    Hallo,

    ich hab da ein paar Probleme atm einen bestimmten Quelltext rauszufiltern..

    Beispielcode sieht wie folgt aus: http://pastebin.ca/997688
    Das result, was ich erhalten möchte darunter..

    Hat da jmd eine Idee?
    PHP-Code:
    $pattern "#<tr>([^<]*)</tr>#is"// bzw. #isU (gar kein Ergebnis)
    $pattern "#<tr>(.*)</tr>#is"//  bzw. #isU (das falsche) 
    funktionieren nicht richtig.

    Sowohl mit preg_match als auch mit ~_all bekomm ich nicht das richtige Ergebnis..

    Bin im Moment recht ratlos
    Problem ist auch, dass die mittleren <table> immer unterschiedliche anzahlen von <tr><td>*</td></tr> reihen haben .. sodass ich auch nicht abzählen kann ansich..

    Jmd. ne Idee?

    mfg
    edit: pattern hervorgehoben, da eventuell übersehen..
    Zuletzt geändert von Blackgreetz; 25.04.2008, 23:25.

  • #2
    N'abend,


    PHP-Code:
    $pattern '&<tr>(.*)</tr>&is'
    ?


    Gruss

    Kommentar


    • #3
      Wo ist der Unterschied zu

      PHP-Code:
      $pattern "#<tr>(.*)</tr>#is"
      ?
      Bis auf die Delimiter ist ja nichts anders^^..

      mfg

      Kommentar


      • #4
        Die Woche war lang, verzeig. <g>

        Was ist denn das 'falsche' Ergebniss?

        Kommentar


        • #5
          Hallo,

          kein Problem.

          Hier mal ausprobiert:

          #isU: http://regexp-evaluator.de/evaluator...dcc0/#ergebnis

          #is: http://regexp-evaluator.de/evaluator...54ce/#ergebnis

          Wo es greedy ist, siehts fast richtig aus, allerdings ist in der Mitte noch der </tr><tr> , der das Ergebnis genau halbieren sollte ....

          mfg

          Kommentar


          • #6
            Soviel ich weiss kannst du das nicht sehr gut mit preg_match lösen. Es gäbe eine Möglichkeit mit lookaheads und ä., aber das ist sehr aufwendig.

            In deinem Fall wäre es am einfachsten einfach eine Schlaufe zu erzeugen, immer das nächste <tr zu suchen und dann eine Laufzahl jeweils um eins erhöhen. Gleichzeitig speicherst du den String bis wo du gekommen bist und Prüfst das nächste Vorkommen von </tr (auch mit stripos z.B.). Die Laufzahl wird bei einem gefundenen </tr immer um 1 gesenkt, also hast du den benötigten string sobald die Laufzahl wieder 0 also false ist. Dann musst du nur noch den String mit > ergänzen und die aktuelle Suchposition um eins erhöhen und dies fortsetzen bis du am Ende des Strings angelangt bist. Alle Treffer kannst in einem Array speichern und von der Funktion zurückgeben lassen.

            Kommentar


            • #7
              Original geschrieben von jmc
              In deinem Fall wäre es am einfachsten einfach eine Schlaufe zu erzeugen, immer das nächste <tr zu suchen und dann eine Laufzahl jeweils um eins erhöhen. Gleichzeitig speicherst du den String bis wo du gekommen bist und Prüfst das nächste Vorkommen von </tr (auch mit stripos z.B.). Die Laufzahl wird bei einem gefundenen </tr immer um 1 gesenkt, also hast du den benötigten string sobald die Laufzahl wieder 0 also false ist. Dann musst du nur noch den String mit > ergänzen und die aktuelle Suchposition um eins erhöhen und dies fortsetzen bis du am Ende des Strings angelangt bist. Alle Treffer kannst in einem Array speichern und von der Funktion zurückgeben lassen.
              Wäre natürlich eine Idee .. werd ich dann nach'm Schlafen mal umsetzen .. - Danke.
              Allerdings die Frage, wie würdest du danach suchen?


              mfg
              Zuletzt geändert von Blackgreetz; 26.04.2008, 01:08.

              Kommentar


              • #8
                wonach suchen?

                Kommentar


                • #9
                  In deinem Fall wäre es am einfachsten einfach eine Schlaufe zu erzeugen, immer das nächste <tr zu suchen und dann eine Laufzahl jeweils um eins erhöhen.
                  Würde jetzt nur auf die doofe Idee kommen, dass 1. Vorkommen des trs zu suchen .... gucken ob vorher ein /tr vorkommt und jenachdem bis dahin abschneiden ... und dann weiter suchen..

                  Gibts da nicht ne elegantere Möglichkeit des Zählens bzw. des Suchens zum Zählen..

                  mfg

                  Kommentar


                  • #10
                    stripos gibt dir z.B. den Ort des vorkommens zurück:

                    PHP-Code:
                    function outer_tags($str$tag){
                     if(
                    stripos ($str"</" $tag$pos) === false){
                      return Array();
                     }
                     
                    $arr = Array();
                     
                    $pos 0;
                     
                    $count = -1;
                     
                    $start = -1;
                     while(
                    stripos ($str"</" $tag$pos) !== false){
                      if(
                    $start == -1){
                       
                    $start stripos($str"<" $tag$pos);
                       
                    $pos $start 1;
                       
                    $count 1;
                       continue;
                      }
                      if(
                    stripos($str"<" $tag$pos) < stripos ($str"</" $tag$pos)){
                       
                    $pos stripos ($str"<" $tag$pos) + 1;
                       
                    $count++;
                      }else{
                       
                    $pos stripos ($str"<" $tag$pos) + 1;
                       
                    $count--;
                      }
                      if(!
                    $count){
                       
                    $arr[] = Array($start$pos strlen($tag) + 2);
                       
                    $start = -1;
                       
                    $count = -1;
                      }
                     }
                     return 
                    $arr;

                    habs nicht getestet, da direkt im Forum geschrieben und ist sehr schlecht optimiert, aber habe momentan keine Zeit noch etwas besseres zu schreiben, vieleicht morgen, falls das Problem noch nicht gelöst ist.
                    Die Funktion gibt einen Array mit allen gefundenen Start- und Endpositionen zurück, die du dann z.B. mit substr aus dem String rausnehmen kannst.

                    Gruss

                    JMC

                    Kommentar


                    • #11
                      mein ansatz bei solch geschachtelten strukturen wäre DOM XML

                      Kommentar


                      • #12
                        Hallo,

                        @3DMax: Danke, guck ich mir mal an

                        @jmc: Genau das meinte ich ja im Post über deiner aw, aber danke fürs Script..

                        Ich habs gleich mal genutzt (noch etwas modifiziert bzw. korrigiert):
                        PHP-Code:
                        <form action="" method="post">
                        <textarea name="text" rows="3" cols="100"><?php echo $_POST['text'];?>
                        </textarea><input type="submit" name="submit" value="submit"
                        </form>
                        <?php
                           
                        function outerTags($str$tag){
                              if(
                        stripos ($str"</" $tag$pos) === false){
                                 return Array();
                              }else{
                                 
                        $arr = Array();
                                 
                        $pos 0;
                                 
                        $count = -1;
                                 
                        $start = -1;
                                 while(
                        stripos ($str"</" $tag$pos) !== false){
                                    if(
                        $start == -1){
                                       
                        $start stripos($str"<" $tag$pos);
                                       
                        $pos $start 1;
                                       echo 
                        "Start: ".$pos."<br>";
                                       
                        $count 1;
                                       continue;
                                    }
                                    if(
                        stripos($str"<" $tag$pos) < stripos ($str"</" $tag$pos)){
                                       
                        $pos stripos ($str"<" $tag$pos) + 1;
                                       echo 
                        "#Found: ".$pos."<br>";
                                       
                        $count++;
                                    }else{
                                       
                        $pos stripos ($str"</" $tag$pos) + 1;
                                       echo 
                        "##Found: ".$pos."<br>";
                                       
                        $count--;
                                    }
                                    if(!
                        $count){
                                       
                        $arr[] = Array($start$pos strlen($tag) + 2);
                                       
                        $start = -1;
                                       
                        $count = -1;
                                       echo 
                        "<p>Ende</p>";
                                    }
                                 }
                                 return 
                        $arr;
                              }
                           }

                           if(isset(
                        $_POST['submit'])){

                            
                        $blubbl outerTags($_POST['text'],'tr');
                            
                        print_r($blubbl);

                           }

                        ?>
                        So.. nun hab ich es getestet mit:
                        Code:
                        <table><tr><td><table><tr><td></td></tr><tr><td></td></tr><tr><td>
                        </td></tr><tr><td></td></tr></table></td></tr>
                        <tr><td><table><tr><td></td></tr><tr><td></td></tr><tr><td></td>
                        </tr><tr><td></td></tr></table></td></tr></table>
                        (Zeilenumbrüche müsste man natürlich alle entfernen)..

                        Wenn ich das Script so mache, bekomm ich nie ein Ende (deshalb die Testausgaben):

                        Code:
                        Start: 8
                        #Found: 23
                        ##Found: 36
                        #Found: 41
                        ##Found: 54
                        #Found: 59
                        ##Found: 72
                        #Found: 77
                        ##Found: 90
                        ##Found: 108
                        
                        Ende
                        Start: 113
                        #Found: 128
                        ##Found: 141
                        #Found: 146
                        ##Found: 159
                        #Found: 164
                        ##Found: 177
                        #Found: 182
                        #Found: 1
                        #Found: 8
                        #Found: 23
                        Wie man sieht, bricht er nach Zeichen 182 irgendwie ab, bzw. findet nichts mehr und fängt wieder vorne an..
                        Was nun aber komisch ist, dass die ganze Tabellenkette 225 Zeichen lang ist. D.h. er "bricht" mitten im 2. gesuchten tr-inhalt ab ... Obwohl danach natürlich noch </tr> und noch weitere <tr> kommen..

                        Konnte man das verstehen ? Wenn ja, weiß jmd woran es liegt? Ich finde es sehr komisch...

                        mfg

                        Kommentar


                        • #13
                          Ist mein Fehler... und ich war schon müde... durch die Addition von 1 , die nötig ist um das nächste Vorkommen zu erhalten verhinderte dauerhaft ein Abbruch der Schleife, da $pos immer wieder auf 1 gesetzt (false + 1) wurde.
                          Habs jetzt kurz noch etwas verbessert und diesmal auch getestet:

                          PHP-Code:
                          function outer_tags($str$tag){
                           
                          $arr = Array();
                           
                          $pos 0;
                           
                          $start = -1;
                           while((
                          $n stripos($str"</" $tag$pos)) !== false){
                            
                          $f stripos($str"<" $tag$pos);
                            if(
                          $start == -&& $f !== false){
                             
                          $start $f;
                             
                          $pos $f 1;
                             
                          $count 1;
                             continue;
                            }
                            if(
                          $f !== false && $f $n){
                             
                          $pos $f 1;
                             
                          $count++;
                            }else{
                             
                          $pos $n 1;
                             
                          $count--;
                             if(!
                          $count){
                              
                          $arr[] = Array($startstrpos($str">"$pos) +1);
                              
                          $start = -1;
                             }
                            }
                           }
                           return 
                          $arr;
                          }

                          /***** Ausgabe *****
                          Array
                          (
                              [0] => Array
                                  (
                                      [0] => 7
                                      [1] => 113
                                  )

                              [1] => Array
                                  (
                                      [0] => 114
                                      [1] => 220
                                  )
                          )
                          */



                          function outer_tags($str$tag){
                           
                          $arr = Array();
                           
                          $pos 0;
                           
                          $start = -1;
                           while((
                          $n stripos($str"</" $tag$pos)) !== false){
                            
                          $f stripos($str"<" $tag$pos);
                            if(
                          $start == -&& $f !== false){
                             
                          $start $f;
                             
                          $pos $f 1;
                             
                          $count 1;
                             continue;
                            }
                            if(
                          $f !== false && $f $n){
                             
                          $pos $f 1;
                             
                          $count++;
                            }else{
                             
                          $pos $n 1;
                             
                          $count--;
                             if(!
                          $count){
                              
                          $arr[] = "\"".substr($str$start,  strpos($str">"$pos) +$start)."\"";
                              
                          $start = -1;
                             }
                            }
                           }
                           return 
                          $arr;
                          }

                          /***** Ausgabe *****
                          Array
                          (
                              [0] => "<tr><td><table><tr><td></td></tr><tr><td></td></tr><tr><td>
                          </td></tr><tr><td></td></tr></table></td></tr>"
                              [1] => "<tr><td><table><tr><td></td></tr><tr><td></td></tr><tr><td></td>
                          </tr><tr><td></td></tr></table></td></tr>"
                          )
                          */ 
                          Sollte also nun zu 99% funktionieren. Die erste Variante ist bei grossen Texten um einiges sparsamer als die zweite und zusätzlich hast du da noch die Positionen falls du diese irgendwie mal brauchs

                          Kommentar


                          • #14
                            Ich bedanke mich für das Script jmc
                            Funkt wunderbar (1. Version mit den Zahlen)..

                            allerdings muss ich nochmal nachfragen:
                            Ist mein Fehler... und ich war schon müde... durch die Addition von 1 , die nötig ist um das nächste Vorkommen zu erhalten verhinderte dauerhaft ein Abbruch der Schleife, da $pos immer wieder auf 1 gesetzt (false + 1) wurde.
                            Wo wird es auf false + 1 gesetzt ? Ich hab mir das Script angeguckt, aber irgendwie komm ich nicht drauf. Vlt sind meine Gedanken durch das permanente draufstarren (bevor ich fragte) schon so steif, dass ich es nicht sehe ^^..

                            mfg

                            Kommentar


                            • #15
                              bei stipos + 1, wenn stripos === false dann gibts 1 aus. Kannst du ja mal mit der alten Version versuchen. deswegen beginnt die Schlaufe immer wieder bei $pos = 1 also stoppt sie nie und es wird ein riesiges Array erstellt bis der Speicher erschöpft ist.

                              Die 2. Version geht doch aber auch? o.O

                              Kommentar

                              Lädt...
                              X