[REGEX] Treffer markieren...?

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

  • [REGEX] Treffer markieren...?

    Hallo Ihr!

    Nach einer Woche harter Arbeit scheint die Volltextsuche auf meiner Homepage nun endlich zu funktionieren. Jetzt möchte ich gerne noch meine Template-Klasse so abändern, daß in jeder Seite innerhalb einer Start- und einer Ende-Marke der oder die Suchbegriffe markiert werden.

    Die Treffer sollen also jeweils von '<span class="treffer">' und '</span>' eingeschlossen werden wobei HTML-Tags natürlich nicht verändert werden dürfen.

    In der FAQ der Newsgroup de.comp.lang.php habe ich dazu auch einen Regulären Ausdruck gefunden. Der scheint aber nicht zu funktionieren.

    Kennt Ihr eine Möglichkeit, wie man die Suchtreffer in den Seiten markieren kann? Da das Ganze erst beim Seitenaufruf passiert, spielt natürlich auch die Geschwindigkeit eine gewisse Rolle.

    Wäre echt toll, wenn Ihr mir da weiterhelfen könntet!

  • #2
    such mal, hatten wir schon!

    Kommentar


    • #3
      Ok, hab nochmal etwas genauer gesucht und bin fündig geworden! Das Hervorheben der Suchbegriffe erledige ich nun in einer kleinen Funktion. Soweit klappt auch alles prima.

      Nur, was ich nicht verstehe ist, daß die Funktion nicht alle Suchbegriffe hervorhebt sondern nur einige - ich habe auch schon nach irgendwelchen Gesetzmäßigkeiten gesucht, werde aber nicht schlau aus der Sache!

      Damit Ihr versteht, von was ich rede kopiere ich hier mal die Funktion rein:
      PHP-Code:
        function highlight_pattern() {
          global 
      $search_string$marker;

          
      // Markierungen im Quelltext:
          
      $start_str "<!-- Start Suchindex -->";
          
      $end_str "<!-- Ende Suchindex -->";

          
      // Start- und Ende-Position ermitteln:
          
      $start_pos strpos($this->files[$this->file_id], $start_str) + strlen($start_str);
          
      $end_pos strpos($this->files[$this->file_id], $end_str$start_pos);
          
      $length $end_pos $start_pos;

          
      // Teilzeichenkette, die durchsucht wird:
          
      $search_substr substr($this->files[$this->file_id], $start_pos$length);

          
      // Teilzeichenkette mit hervorgehobenen Suchbegriffen:
          
      $search_substr_replaced $search_substr;

          
      $array explode(" "$this->search_pattern);
          for(
      $i=0;$i<count($array);$i++) {
            
      $pattern trim($array[$i]);

            
      // falls Wort zu kurz, naechstes Wort:
            
      if(strlen($pattern) < $search_string["minlength"])
              continue;

            
      $pattern_1 $pattern;
            
      $pattern_2 htmlentities($pattern);

            
      // Suchbegriff(e) in Teilzeichenkette hervorheben:

            // unerschluesselten Suchbegriff hervorheben:
            
      $search_substr_replaced preg_replace('/(\>[^\<]*)('.quotemeta($pattern_1).')([^\<]*\<)/i'"$1".$marker["start"]."$2".$marker["end"]."$3"$search_substr_replaced, -1);

            
      // falls nichts ersetzt wurde, verschluesselten Suchbegriff markieren:
            
      if(!stristr($search_substr_replaced$marker["start"].$pattern_1.$marker["end"]))
              
      $search_substr_replaced preg_replace('/(\>[^\<]*)('.quotemeta($pattern_2).')([^\<]*\<)/i'"$1<span class=\"suchstring\">$2</span>$3"$search_substr_replaced, -1);

          }

          
      // Teilzeichenkette mit hervorgehobenen Suchbegriffen in Template einfuegen:
          
      $this->files[$this->file_id] = str_replace($search_substr$search_substr_replaced$this->files[$this->file_id]);

        } 
      Also die Klassen-Variable '$this->search_pattern' enthält den Suchbegriff, die globale Variable '$marker' enthält die Start- und Ende-Tags zum Markieren des Suchbegriffs. Die globale Variable '$search_string' kommt aus der Konfigurations-Datei und enthält die minimale Wortlänge für die Suche. '$this->files[$this->file_id]' enthält das gesamte Template.

      Vielleicht sieht einer von Euch sofort, wo der Haken liegt. Ich bin jedenfalls dankbar für jeden Hinweis!!!
      Zuletzt geändert von Rumborak; 06.06.2003, 19:23.

      Kommentar


      • #4
        Nur, was ich nicht verstehe ist, daß die Funktion nicht alle Suchbegriffe hervorhebt sondern nur einige - ich habe auch schon nach irgendwelchen Gesetzmäßigkeiten gesucht, werde aber nicht schlau aus der Sache!
        vielleicht wenigstens nen Beispiel. Ganz ohne Anhaltspunkt wirds schwierig.

        Kommentar


        • #5
          Ich mach´ das jetzt so:

          Code:
          $string = preg_replace("/((<[^>]*)|(".quotemeta($pattern)."|".quotemeta(htmlentities($pattern))."))/ie", '"\2"=="\1"? "\1":$marker["start"]."\3".$marker["end"]', $string);
          Da der Suchbegriff immer mit unverschlüsselten HTML-Sonderzeichen vorliegt, werden durch den Ausdruck sowohl die Begriffe mit unverschlüsselten als auch mit verschlüsselten Sonderzeichen ersetzt.

          Jetzt habe ich aber noch folgendes Problem: Bei Überschneidungen werden manche Treffer entweder garnicht oder doppelt markiert. Wird z. B. nach den Zeichenfolgen "mali" und "lige" gesucht, so werden im Wort "nochmaligem" nur die Buchstaben markiert, die zuerst eingetippt wurden, also "mali". Der Rest wird dann nicht mehr gefunden, da sich der Text ja bereits verändert hat.

          Wenn ich das Ganze auf die Spitze treibe werden bestimmte Zeichenfolgen auch doppelt markiert, z.B. bei der Suche nach "damaliger", "dam", "amal", "mali" und "lige" sieht das Wort "damaliger" im Quelltext dann so aus:

          Code:
          <span class="suchstring"><span class="suchstring">dam</span>a<span class="suchstring">lige</span>r</span>
          Weiß jemand, wie ich solche Überschneidungen vermeiden kann?
          Zuletzt geändert von Rumborak; 10.06.2003, 23:16.

          Kommentar

          Lädt...
          X