Mal wieder: RegExp überall, außer im Link

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

  • #16
    Ich weiß.
    Klingt komisch, ist aber so...

    Mal zur Veranschaulichung:
    Code:
    <td onlick="index.php?var1=schlumpf">Schlumpf</td>
    Es wird ersetzt zu:
    Code:
    <td onlick="index.php?var1=<span>schlumpf</span>"><span>Schlumpf</span></td>

    Kommentar


    • #17
      Original geschrieben von xmedia2000
      Ich denke aber, das meine DOM Methode dort schneller ist, da ja nur TD Zellinhalte geparst werden und preg_replace würde auf alle Elemente angewendet.
      Und XML parsen kostest gar nichts, meinst du ...?
      <td onlick="index.php?var1=schlumpf">
      Warum redest du von Links, wenn es sich gar nicht um Links handelt?
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #18
        Also bei meiner Suchfkt mit diesem RegExp passiert definitiv ned
        Bitte mal den ensprechenden Code posten

        Gruss

        tobi
        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

        Kommentar


        • #19
          Und XML parsen kostest gar nichts, meinst du ...?
          Hier mit microtime() errechnete Zeit für DOM: 0.003043
          Hier mit microtime() errechnete Zeit für preg_replace: 0.093879


          Warum redest du von Links, wenn es sich gar nicht um Links handelt?
          Weil es völlig wurscht ist, ob es onclick oder <a href> ist. Habe beide Varianten schon probiert.

          Kommentar


          • #20
            @jahlives:
            Kuckst du hier:


            Funktion in ausgelagerter Datei:
            PHP-Code:
            function highlightSearchtext ($searchtext$searchterm$highlightcolor) {
              
            $searchterm trim($searchterm);
              
              
            $pattern "#((<[^>]*)|$searchterm)#ieU";
              echo 
            preg_replace($pattern'"\2"=="\1"? "\1":"<span style=\"background-color:'.$highlightcolor.';\"><b>\1</b></span>"'$searchtext);
              

            ausführende Datei, wobei $output reiner HTML Quelltext (unterhalb <body>) ist.
            PHP-Code:
            highlightSearchtext($output$_REQUEST['suchausdruck'], '#FFFF99'); 

            Kommentar


            • #21
              Mein RegExp verwendet aber die Referenz \0 und nicht die Ref \1 !
              Habe gerade eben noch bei mir auf dem Server geschaut wie der RegExp dort ausschaut (der Code funzt kannste hier testen)
              Code:
              $test = preg_replace("/((<[^>]*)|\b$text\B)/ei",'"\\2"=="\\1"? "\\1" : "<span style=\"background-color:yellow;\">\\0</span>"',$temp);
              Code Tags musste ich nehmen damit mir die Backslashes nicht gefressen werden.
              Mit dem Modifikator \b und \B kannst du festlegen ob der Treffer am Anfang eines Wortes, als ganzes Wort oder irgendwo im Text vorkommen soll

              Gruss

              tobi
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #22
                Ok.
                Funktioniert, habe jetzt aber ein anderes Problem.

                jetzt maskiert er alle einfachen Anführungszeichen ' zu \\'...

                Code:
                <td onclick="location.href=\\'index.php?var1=schlumpf\\'><span>Schlumpf</span></td>
                Ergo hab ich jetzt JavaScript Fehler und mein Link geht nicht.

                Kommentar


                • #23
                  Und was hindert dich daran vor der Rückgabe des Strings ein stripslashes() über den String zu lassen ?

                  Gruss

                  tobi
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #24
                    Nix.
                    Bin nur anfänglich nicht darauf gekommen.

                    Hab ich schon gemacht und funzt jetzt alles von die feinst....

                    Vielen Dank für Eure Mühen.

                    Kommentar


                    • #25
                      PHP-Code:
                      <?php

                          $lastfound 
                      0;
                          
                      $text 'Dies ist ein <acronym title="HTML">HTML</acronym> Dokument.';
                          
                      $searchterm 'html';
                          
                          while ( 
                      $startpos strpos $text'<'$lastfound ) ) {
                              
                      $subtext substr $text$lastfound$startpos $lastfound );
                              
                      $text str_ireplace $subtextstr_ireplace $searchterm'<b>' $searchterm '</b>'$subtext ), $text );
                              
                      $lastfound strpos $text'>'$startpos );
                          }
                          
                          echo 
                      $text;

                      ?>
                      ... hab mal meinen vorschlag korigiert - ich wette das ist schneller und verursacht nebenbei auch keine slashes
                      EDIT:
                      $lastfound korigiert
                      Zuletzt geändert von tontechniker; 07.03.2007, 16:50.
                      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                      Kommentar


                      • #26
                        Original geschrieben von tontechniker
                        ich wette das ist schneller
                        Und was macht es aus
                        PHP-Code:
                        $text 'Dies ist ein <a href="xyz.HTML">Link</a> <acronym title="HTML">HTML</acronym> Dokument.'
                        ...?

                        Und bei
                        PHP-Code:
                        $text 'Dies ist ein <a href="xyz.HTML">Link</a>, gefolgt von einem <acronym title="HTML">HTML</acronym> Element.'
                        schlägt mir reproduzierbar sogar die max_execution_time (von 10 Sekunden auf dem Testsystem) zu.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #27
                          @tontechniker
                          Glaube auch nicht dass dies schneller ist. Mittels des RegExp lasse ich eine Suche über 65 Dateien unter 1 Sekunde durchlaufen. Mit deinem werde ich das gar nicht erst probieren
                          Ausserdem ist die Flexibilität für eine Suche mittels RegExp grösser --> Modifikatoren ändern und die Suche funzt schon ganz anders (z.B. nur Wortbeginn, ganzes Wort, oder nur im Wort enthalten)

                          Gruss

                          tobi
                          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                          Kommentar


                          • #28
                            Und was macht es aus...?

                            Und bei
                            ...
                            schlägt mir reproduzierbar sogar die max_execution_time (von 10 Sekunden auf dem Testsystem) zu.
                            funktioniert beides ohne probleme?

                            EDIT:
                            zur zeit: bei diesem einfachen String braucht die Schleife 0.000184 und der Regex 0.000292 ... glaub ja nicht das es schneller wird
                            Zuletzt geändert von tontechniker; 07.03.2007, 17:11.
                            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                            Kommentar


                            • #29
                              zur zeit: bei diesem einfachen String braucht die Schleife 0.000184 und der Regex 0.000292 ... glaub ja nicht das es schneller wird
                              Kann bei diesem einfachen String ja sein, dass deine Version schneller ist. Was aber wenn du 16000 Treffer markieren mussst ? Dauert bei mir Pi mal Auge 1-2 Sekunden (je nachdem wie ausgelastet der Server ist).
                              Und ausserdem ist deine Version wie bereits angetönt, alles andere als flexibel.
                              Ich werde deine Code mal auf die 16000 Treffer loslassen zum Benchmarken und da Ergebnis hier posten.

                              Gruss

                              tobi
                              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                              Kommentar


                              • #30
                                @tontechniker
                                Habe deinen Code und meinen jetzt im Benchmark mal gegeneinander laufen lassen. Zuerst wollte ich in einer Schleife die Suche in einer 89 kb Datei 100x durchlaufen lassen und die Zeiten messen. Mit dem RegExp geht das ohne Probleme und dauert ca 50 Sekunden (Gesamtlaufzeit). Einzelne Zeiten liegen zwischen 0,4 und 0,8 Sekunden pro Durchlauf.
                                Dein Code kann die Suche nicht einmal bei einem Durchlauf innerhalb der Max Execution Time (360 Sekunden) durchlaufen !

                                Es ist klar, dass dein Code bei einem sehr kurzen zu durchsuchenden Text schneller ist, weil du die RegExp Engine ja nicht anwerfen musst. Die oben genannten 0.8 Sekunden gelten nur für den ersten Durchlauf, danach liegen die Zeiten eher bei 0.4 s.

                                Soviel zum Benchmark

                                Gruss

                                tobi
                                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                                Kommentar

                                Lädt...
                                X