Mastodon

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

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;
}

Viel Spaß beim Coden…

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.