- Marnems Sicht der Dinge - http://www.marnem.de/blog -

Search-Hilite und Googlesuche aus dem Firefox heraus


Das Plugin Search-Hilite [1] hab ich nun schon seit über einem Jahr [2] im Blog integriert, doch erst heute habe ich wieder einmal einen fetten Bug darin entdeckt.

Search-Hilite sorgt dafür, dass Suchbegriffe auf einer Seite farblich hervorgehoben werden. Hintergrund ist, dass man so deutlich schneller sondieren kann, ob die Seite wirklich das gesuchte Themengebiet abdeckt.

Vor einem Jahr stellte ich fest, dass Search-Hilite ein Problem mit Umlauten [3] hat. Ich konnte dieses Problem lösen, indem ich den Quelltext des Plugins veränderte. Dies habe ich dem Pluginautor auch mitgeteilt, doch leider wird das Plugin anscheinend nicht weiterentwickelt.

Der neue Bug ist etwas anders gelagert. Kommt man über Google auf das Blog wurden manchmal nicht die Suchbegriffe, sondern jedes Vorkommen des Buchstaben „t“ markiert. Bis heute konnte ich nicht nachvollziehen woher dieser Bug kommt. Bei den heutigen Tests im Rahmen der Renovierungsarbeiten [4] fiel mir dann auf, dass es einen Unterschied macht, ob ich den Suchbegriff bei Google direkt oder im Firefox Suchfenster eingebe:
Der Referer [5] ist unterschiedlich

Suche ich zB nach Bosbach "Wegwerf-Terrorist sehen die Referer wie folgt aus:

  1. http://www.google.de/search?hl=de<strong>&q</strong>=bosbach+%22wegwerf-terrorist%22&btnG=Suche&meta= bei Eingabe direkt bei Google
  2. http://www.google.com/search<strong>?q</strong>=bosbach+%22wegwerf-terrorist%22&ie=utf-8&oe=utf-8<strong>&aq=t</strong>&rls=org.mozilla:de:official&client=firefox-a bei Eingabe im Firefox Suchfenster

Das Problem ist nun, wie die Suchwörter in den URLs codiert sind. Bei
1. „/search?hl=de&q=bosbach+%22wegwerf-terrorist%22&“ und bei
2. „/search?q=bosbach+%22wegwerf-terrorist%22&“

Bei 1. also „&q“ und „?q“ bei 2.
Search-Hilte filtert mit dem Regulären Ausdruck [6] /^.*q=([^&]+)&?.*$/i und stolpert leider über das &aq=t, denn das „t“ überschreibt die eigentlichen Suchbegriffe.

Um das Problem zu lösen habe ich ein wenig mit dem Regulären Ausdruck rumgespielt, aber bin damit nicht zu Rande gekommen. Stattdessen habe ich mich umgesehen, wie andere das Problem lösen und bin auf das Plugin Landingsites(de) [7] von Frank Bültge gestoßen, das ja auch bei mir im Einsatz ist. Dort wird, statt zu Versuchen das Problem auf einen Streich zu lösen, das Problem (wie auch der String) in kleine, handhabbare Stücke zerlegt.

function ls_get_terms($d) {
	$terms       = null;
	$query_array = array();
	$query_terms = null;

	// Get raw query
	$query = explode('&'.$d.'=', $_SERVER['HTTP_REFERER']);
	if($query[1] == '') {
		$query = explode('?'.$d.'=', $_SERVER['HTTP_REFERER']);
	}
	$query = explode('&', $query[1]);
	$query = urldecode($query[0]);

	// Remove quotes, split into words, and format for HTML display
	$query = str_replace("'", '', $query);
	$query = str_replace('"', '', $query);
	$query_array = preg_split('/[\s,\+\.]+/',$query);
	$query_terms = implode(' ', $query_array);
	$terms = urldecode($query_terms);

	return $terms;
}

Fügt man nun diese Funktion Search-Hilite hinzu, muss man nur noch die bestehende Regexerei auskommentieren und bekommt zuverlässig markierte Suchbegriffe:

// Google query parsing code adapted from Dean Allen's
// Google Hilite 0.3. http://textism.com
// $query_terms = preg_replace('/^.*(&|\?)q=([^&]+)&?.*$/i','$1', $referer);
// $query_terms = preg_replace('/\'|"/', '', $query_terms);
$query_terms = ls_get_terms("q");
$query_array = preg_split ("/[\s,\+\.]+/", $query_terms);

Falls ihr Landingsites(de) bereits einsetzt, solltet ihr die Funktion leicht umbenennen (zB ls_get_terms_hilite). Alternativ kann man auch darauf verzichten die Funktion zu kopieren und ruft sie direkt aus Landingsites(de) auf, allerdings wirken sich dann natürlich Veränderungen an Landingsites(de) auch auf Search-Hilite aus.

Ach ja, natürlich könnte ich das modifizierte Search-Hilite auch direkt hier zum Download bereit stellen, möchte dies aber erstmal nicht tun, bevor ich Frank Bültge um Erlaubnis gebeten habe, seinen Code verwenden zu dürfen. Da Frank momentan in Urlaub [8] ist, kann dies aber noch 3 Wochen dauern…