Entities “ganz” lassen

Bei Einsatz des PlugIns “Search Hilite” gibt es manchmal unerwünschte Ergebnisse. Wenn im Suchbegriff Zahlen vorkommen, kann es (wie hier beschrieben) passieren, dass Entities “zerpflückt” werden.

So wird, wenn der Suchbegriff beispielsweise eine abgetrennte “1″ enthält, aus …

“wp-config.php”

… dann im Ergebnis Folgendes:

&#8220;wp-config.php&#822<span class="hilite1">1</span>;

Es entstehen damit “abgebrochene” Zeichen und ungewollte “Highlights”, die nichts mit dem eingegebenen Suchbegriff zu tun haben. Denn “Search Hilite” untersucht einen String auf Treffer, in dem bereits alle Sonderzeichen umgewandelt sind.

Das passiert in der Datei “search-hilite.php” von Zeile 163 bis 170:


if (!empty($term) && $term != ' ') {
$term = preg_quote($term, '/');
	if (!preg_match('/<.+>/',$text)) {
		$text = preg_replace('/('.$term.')/i','<span class="'.$hilite_class.'">$1</span>',$text);
	} else {
		$text = preg_replace('/(?<=>)([^<]+)?('.$term.')/i','$1<span class="'.$hilite_class.'">$2</span>',$text);  //taken out the \b option to also mark substrings
	}
}

 

Ein eleganter Weg zu vermeiden, dass Entities nach dem Muster Kaufmännisches “und” plus Raute plus Ziffernfolge plus Semikolon (also Beispielsweise “&#8221;” etc.) in der HTML-Ausgabe durch die “Search Hilite”-Spans “zerpflückt” werden, ist der, dem PlugIn gleich von vornherein einen Text ohne Entities vorzugeben.

Das erreicht man am stressfreiesten dadurch, die auf $text angewandten Text-Filter bereits vor Durchlauf der “Hilite”-Funktion zu entfernen. Nach der Zeile 10

define("SEARCHHILITE", "190");

… muss man also nur Folgendes einfügen:


remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
if (function_exists('o42_cu_content')) {
	remove_filter('the_content', 'o42_cu_content');
	remove_filter('the_excerpt', 'o42_cu_content');
}

Und damit schlägt man gleich zwei Fliegen mit einer Klappe: Erstens werden Entities nicht mehr auseinandergerissen - und zweitens werden auch Treffer farbig markiert, in denen Umlaute oder andere Sonderzeichen vorkommen.

Das ist doch schon mal ein Erfolg - und das ganz ohne Reguläre Ausdrücke.

 

Alle Treffer hervorheben

Außerdem ist mir aufgefallen, dass durch “Search Hilite” eigentlich zu wenig markiert wird. Das sieht man, wenn man Zeichenketten wie “en”, “1″ oder Ähnliches in das Suchfenster eingibt. Der Fehler steckt in Zeile 165 (bzw. ist das nach oben beschriebener Änderung inzwischen etwa Zeile 170 geworden):

if (!preg_match('/<.+>/',$text)) {

Diese Zeile muss geändert werden in:

if (!preg_match('/<.*>/',$text)) {

… und danach wird jedes Vorkommen des eingegebenen Such-Strings hervorgehoben.

 

“Zusammenarbeit” mit Search Excerpt

So richtig nett wird die überarbeitete Suche dann bei gleichzeitigem Einsatz des PlugIns “Search Excerpt”. Das Problem ist bekannt - Oftmals liegt der Treffer gar nicht innerhalb des Auszuges, der in den Suchergebnissen gezeigt wird, denn the_content(); und the_excerpt(); sind zwei verschiedene paar Schuhe …

Es kann schon irritieren, wenn man nach einer Such-Anfrage eine lange Liste von Beiträgen bzw. Beitrags-Ausschnitten sieht - Lauter Treffer, Juhu! - Bloß das gesuchte Wort ist in den gekürzten Inhalten nirgends zu sehen … Mit “Search Excerpt” werden derlei Probleme umgangen - Nach Aktivierung werden die gefundenen Treffer mitsamt einiger umgebender Wörter wiedergegeben.

Das PlugIn arbeitet zwar nicht ganz perfekt, zum Ausprobieren: Einfach mal “code” hier in die Suche eingeben … Aber macht nichts - besser als die Standard-Suche ist das allemal.

Wieder ein kleines Ausgabe-Problem: “Search Excerpt” hebt ebenfalls “seine” Treffer hervor:

<strong class="search-excerpt">Treffer</strong>

Zusammen mit “Search Hilite” wird das jedoch überflüssig - und wenn der eingegebene Suchbegriff ein Teil des Wortes “search-excerpt” ist - gibt’s wieder überraschende Ergebnisse. Denn die Hervorhebungen werden von “Search-Hilite” mit durchsucht, und die Treffer werden gnadenlos (teilweise mitten im HTML-Tag) markiert. Zudem werden Auslassungszeichen mit drei Punkten und einem geschützten Leerzeichen &nbsp; erzeugt - manchmal sorgt auch das für ein paar Macken.

In der PlugIn-Datei “ylsy_search_excerpt.php” sind also die Zeilen 154 bis 159 zu bearbeiten:


$text = (isset($newranges[0]) ? '' : '...&nbsp;').
    implode('&nbsp;...&nbsp;', $out).'&nbsp;...';
$text = preg_replace('/('.implode('|', $keys) .')/iu',
                     '<strong class="search-excerpt">\0</strong>',
                     $text);
return "<p>$text</p>";

… ändern in:


$text = (isset($newranges[0]) ? '' : '... ').
    implode(' ... ', $out).' ...';
/*$text = preg_replace('/('.implode('|', $keys) .')/iu',
                     '<strong class="search-excerpt">\0</strong>',
                     $text);*/
return $text; //return "<p>$text</p>";

Zu guter Letzt müsste noch die “search.php” des aktiven Themes dahingehend geändert werden, dass die nunmehr fehlenden Absatzmarken um …

<?php the_excerpt(); ?>

… nachgetragen werden:

<p><?php the_excerpt(); ?></p>

 

Fertig …?

Ich denke schon. Zumindest hab ich alle mir einfallenden Kombinationen von Suchbegriffen aus mehreren Buchstaben, einer Zahl, einem Buchstaben, mehreren Zahlen, mehreren einzelnen Buchstaben etc. ausprobiert, meine Seite über mehrere verschiedenartige Zeichenketten über Google gesucht und angesurft - Gravierende Faxen scheint’s nicht mehr zu geben - Falls doch, bitte ich um Kommentare.

:-)

Und das war sie dann wohl, die lange Nacht mit viel Kaffee

 

Download

Die wie in diesem Beitrag beschrieben geänderten Versionen beider PlugIns können direkt hier heruntergeladen werden:

 

Nachtrag (19. Februar 2007)

Zwei Dinge hab ich bei der Änderung von “Search Hilite” noch vergessen, aber jetzt sollte eigentlich alles soweit stimmen …

1) Gefundene Umlaute zurückwandeln

Wenn “Search Hilite” nach den in diesem Beitrag beschriebenen Änderungen Umlaute markiert, wird alles innerhalb der Markierung nicht in Entites zurückgewandelt, so dass dann Zeichen wie “Ä” oder “ß” direkt im Quelltext stehen. Der Umlaut-Filter muss also “am Ende” für “excerpt” und “content” wieder ausgeführt werden.

2) Suchmaschinen-Treffer in Kommentaren

“Search Hilite” markiert ja auch gefundene Suchbegriffe in Kommentaren, wenn die Seite über eine Suchmaschine erreicht wurde. Damit auch Umlaut-Treffer in Kommentaren farbig hinterlegt werden, muss man auch auch für den “comment_text” den Umlaut-Filter vor Durchlauf des PlugIns entfernen (jedenfalls, wenn Clean-Umlauts installiert ist) - und ebenfalls am Ende wieder ausführen.

Letzteres zu testen war ein bisschen schwierig, aber schließlich hab ich dann doch einen Suchbegriff mit Umlaut gefunden, über den ich eine gunnart.-Seite erreicht hab, die nicht nur kommentiert war - sondern in deren Kommentaren auch noch der Umlaut-Suchbegriff aufgetaucht ist. In diesem Fall war es übrigens über Google der Suchbegriff “search hilite gunnart für”, mit dem ich testen konnte. (Eventuell noch mal auf den “Suche”-Knopp klicken, falls dann nichts “gehighlightet” wird)

Download der zweiten Überarbeitung von “Search Hilite” hier: search-hilite_Reloaded2.zip