Skip to content

Search highlighting via Referrer

Für die Website der Handball Abteilung des TuS Griesheims habe ich eine Suchfunktion inklusive Hervorhebung (engl. highlighting) der Suchergebnisse in PHP implementiert.

Die Funktionen dieser Highlighting Funktion umfassen:

  • Die Suchoperatoren der booleschen Volltextsuche von MySQL werden entfernt
  • Durch Leerzeichen getrennte Suchbegriffe werden einzeln hervorgehoben
  • Die Suchbegriffe werden mit verschieden Farben hervorgehoben
  • Sonderzeichen werden escaped
  • Aus dem Referrer verschiedener Suchmaschinen werden die Suchbegriffe extrahiert und hervorgehoben

Dies ist der relevante Quelltext dieser Highlighting Funktion (hl):

function hl($text, $words) {
if(is_array($words)) {
$colors = array('#ff9999', '#ffff99', '#ff99ff', '#99ffff','#99ff99', '#9999ff');
foreach ($words as $word) {
if(!empty($word)) {
if ($i++ >= count($colors))
$i = 0;
$text = preg_replace('/(' . preg_quote($word) . ')(?![^< ]+>)/i', '${1}', $text);
}
}
}
return $text;
}
function get_search_words() {
$referer = urldecode($_SERVER['HTTP_REFERER']);
if(preg_match('/www\.google.*/i',$referer)
|| preg_match('/search\.msn.*/i',$referer)
|| preg_match('/search\.yahoo.*/i',$referer)
|| preg_match('/search\.lycos\.com/i', $referer)
|| preg_match('/search\.aol\.com/i', $referer)
|| preg_match('/ask\.com/i', $referer)
|| preg_match('/search\.netscape\.com/i', $referer)) {
if(preg_match('/(www\.google.*)|(search\.msn.*)|(ask\.com)/i',$referer))
$delimiter = "q";
elseif(preg_match('/search\.yahoo.*/i',$referer))
$delimiter = "p";
elseif(preg_match('/(search\.lycos\.com)|(search\.aol\.com)|(search\.netscape\.com)/i', $referer))
$delimiter = "query";
$pattern = "/^.*" . $delimiter . "=([^&]+)&?.*\$/i";
$query_terms = preg_replace($pattern, '$1', $referer);
}
elseif (!empty($_GET['hl'])) {
$query_terms = rawurldecode($_GET['hl']);
}
else
return false;
$search_array = escape_search_words($query_terms);
return $search_array;
}
function escape_search_words($query_terms) {
$query_ops = array('+', '-', '< ', '>', '~', '*', '"', '(', ')');
$query_terms = trim( $query_terms);
$query_terms = preg_replace('/[(' . preg_quote(implode($query_ops)) . ')]/', '', $query_terms);
$query_array = preg_split ("/[\s,\+\.]+/", $query_terms);
return $query_array;
}

Vielleicht ist diese Funktion ja auch für eure Projekte interessant. Viel Spaß beim Coden…