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…