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

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

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

    Also. Hab die Suche bemüht, jedoch ohne wirklichen Erfolg.
    Zum Problem:
    Ich habe eine Suche, die im Ergebnis das gesuchte Wort im gesamten Text farblich markiert.

    PHP-Code:
    $pattern = "/(([<?>]*)|$suchwort)/ie";
    echo preg_replace($pattern,'"\2"=="\1"? "\1":"<span style=\"background-color:$highlightcolor;font-weight:bold;\">\1</span>"', $suchwort);
    Funktioniert wunderbar. Das Problem ist, das auch in HTML Tags gesucht wird. So z.B. in einem Link mit mehreren Varibalen z.B: index.php?var1=value1&var2=value2 etc.

    Dann hab ich im Link auch die Ersetzung mit <span> stehen. Passt also nicht. Gibts da eine Regel um, nicht in <a Tags zu suchen??

    Danke schonmal vorab für die Hilfe.
    Zuletzt geändert von xmedia2000; 05.03.2007, 11:50.

  • #2
    Würd ich mit negativen Assertions machen, irgendwas wie davor kein < und dahinter kein > mit ungreedy und sonst kein <> in den Zeichen zwischen Suchstring und >/<
    Zuletzt geändert von ghostgambler; 05.03.2007, 14:17.

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Denken kann ich mir das auch, nur leider hab ich keinen Ansatzpunkt für die passende Expression dazu...

      Meine derzeitigen Pattern:

      PHP-Code:
      $pattern "/((<[^>]*)|$suchwort)/ieU"
      geht auch, nur wie mach ich das mit davor kein "<" kommen darf und dahinter kein ">" kommen darf...

      Kommentar


      • #4
        Hab das ganze nun folgendermaßen gelöst.

        PHP-Code:
                $searchterm trim($searchterm);
                
        $pattern "/((<[^>]*)|".$searchterm.")/is";
                
        $replacestart "<i>";
                
        $replaceend "</i>";
                
                
        $doc = new DOMDocument("1.0""UTF-8");
                
        $doc->preserveWhiteSpace false;
                
                
        $doc->loadHTML($searchtext);
            
                if(
        $doc) {
                    
        $cells $doc->getElementsByTagName("td"); // Lade TD Nodes
                        
        foreach($cells as $cell) {
                            
        $cell->nodeValue preg_replace($pattern$replacestart.'\\1'.$replaceend$cell->nodeValue);
                        }
                echo 
        $doc->saveHTML();
                } else {
                    echo 
        "Fehler beim Laden des Dokuments per PHP DOM.";
                } 
        Meine HTML Datei ($searchtext) wird per DOM eingelesen und ich lasse dann einfach nur in allen TD Zellen ersetzen.
        Meinen Link hab ich einfach per TD onclick gemacht.

        Funktioniert soweit auch. Ein Problem hab ich aber immernoch.
        Jetzt schreibt er mir & lt i & gt TEST & lt /i & gt, statt <i>TEST</i>...
        Hab schon mit html_entities_decode gespielt. Macht er aber nicht...

        Hat jemand evtl. noch eine Idee?

        Kommentar


        • #5
          Original geschrieben von xmedia2000
          Jetzt schreibt er mir & lt i & gt TEST & lt /i & gt, statt <i>TEST</i>...
          Na was ein Wunder ...

          Was ist das für ein Knoten, dessen Inhalt du da bearbeitest? Richtig, (höchstvermutlich) ein Textknoten.
          Du nimmst doch nicht ernsthaft an, der würde aufgeplittet und ein Elementknoten eingefügt, nur weil du im Textknoteninhalt < und > einfügst ...?

          Wenn du ein neues Element willst, musst du das schon mit DOM-Methoden erzeugen und einhängen.
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Mmh.
            Stimmt. Da könntest du recht haben...
            Ok. Darauf bin ich jetzt irgendwie nicht gekommen...

            Kommentar


            • #7
              ich würde das dom system nicht benutzen da es für ein produktives system imho viel zu langsam ist (regex ist nicht viel besser aber in diesem fall einfacher)

              du kannst einfach mit einem lookaround arbeiten


              PHP-Code:
              $pattern "/(?<!\<.*?)((\<[^\>]*)|$suchwort)(?!.*?\>)/ieU"
              sollte soweit gehen ist aber ungetestet
              Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

              Kommentar


              • #8
                @tontechniker:
                preg_replace wäre mir auch lieber...
                Aber die pattern passen nicht. hab noch ein wenig probiert, ohne erfolg...
                Er findet zwar alles und ersetzt nicht im link, aber auch nicht das ergebnis mit <span></span>

                Kommentar


                • #9
                  also mit DOM klappts nun:
                  hier der funktionierende code: (mit Sicherheit nicht die eleganteste Lösung)

                  PHP-Code:
                          $searchterm trim($searchterm);
                          
                          
                  $doc = new DOMDocument("1.0""UTF-8");
                          
                  $doc->preserveWhiteSpace false;
                          
                  $doc->loadHTML($searchtext);
                      
                          if(
                  $doc) {
                              
                  $cells $doc->getElementsByTagName("td"); // Lade TD Nodes
                                  
                  foreach($cells as $cell) {
                                  
                                      if(
                  preg_match("/".$searchterm."/is"$cell->nodeValue)) 
                                      {
                                          
                  $zellen_inhalt $cell->nodeValue// Erst den Inhalt speichern
                                          
                  $cell->nodeValue ""// Zelleninhalt leeren
                                          
                  $bold $cell->appendChild(new DOMElement("span")); // Span style hinzufügen
                                          
                  $bold->setAttribute("style""background-color:".$highlightcolor.";font-weight:bold");
                                          
                  $bold->nodeValue $zellen_inhalt;  // Inhalt in span setzen
                                      
                  }
                                  }
                          echo 
                  $doc->saveHTML();
                          } else {
                              echo 
                  "Fehler beim Laden des Dokuments per PHP DOM.";
                          } 

                  Kommentar


                  • #10
                    ich hab dir doch ein stichwort gepostet wie es mit preg_replace gehen sollte - kommst du damit nicht weiter?
                    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                    Kommentar


                    • #11
                      doch. aber die gehen auch nicht...
                      hab die RegExp noch nie kapiert...

                      Kommentar


                      • #12
                        PHP-Code:
                        $lastfound 0;
                        $searchtext 'Die ist ein <acronym title="HTML">HTML</acronym> Dokument.';
                        $searchterm 'html';
                        $text $searchtext;

                        while ( 
                        $startpos strpos $searchtext'<'$lastfound ) {
                        $text str_ireplace $searchterm'<span style="...">' $searchterm '</span>'substr $text$lastfound$startpos $lastfound );
                        $lastfound strpos $searchtext'>'$starpos );

                        das sollte wesentlich schneller sein (sollte das so nicht ganz funktionieren lass die kurz die strings ausgeben evtl. stimmen die zeichenpositionen nicht ganz) - das ganze läuft auch noch in einer schleife oder?
                        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                        Kommentar


                        • #13
                          Habe ich anno dazumal für meine Suchfkt auf der Seite verwendet
                          PHP-Code:
                          $str preg_replace("/((<[^>]*)|b".$suche."b/ie",'"\\\2"=="\\\1" : "<span style=\"background-color:yellow\">\\\00</span>"',$deinString); 
                          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


                          • #14
                            @ jahlives.
                            Danke, aber den Pattern hatte ich schon.
                            Geht zwar, aber eben auch in Links.
                            Da Problem ist, das ich eine ganze HTML einlese. 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.

                            Man muss dazu sagen, das ich eine Seite habe, die eine riesige Tabelle enthält... Ohne divs o.ä.

                            Kommentar


                            • #15
                              Geht zwar, aber eben auch in Links.
                              Heisst das, dass dir auch Teile ersetzt werden, die zwischen <a und > stehen ? Kann eigentlich nicht sein...
                              Oder meinst du den Linktext ?

                              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