Search highlighting via Referrer

Für die Handballseite des TuS Griesheims habe ich für die Suchfunktion eine Highlighting Funktion in PHP geschrieben. Diese hebt bestimmte Wörter eines Textes hervor.

  • die Suchoperatoren der boolschen Volltextsuche von Mysql werden entfernt
  • durch Leerzeichen getrennte Suchbegriffe werden einzeln hervorgehoben
  • die Suchbegriffe werden mit verschieden Farben hervorgehoben
  • Sonderzeichen usw. werden escaped
  • Aus dem Referrer verschiedener Suchmaschinen werden die Suchbegriffe extrahiert und hervorgehoben

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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) . ')(?![^&lt; ]+&gt;)/i', '<span>${1}</span>', $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 . "=([^&amp;]+)&amp;?.*\$/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('+', '-', '&lt; ', '&gt;', '~', '*', '"', '(', ')');
 
	$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;
}

Viel Spaß beim Coden…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.