<?php
/**
* suchergebnisse hervorheben
*/
$loc_de = setlocale(LC_ALL, 'de_DE@euro');
$example = <<< EOT
<h2>Ein Garten</h2>
<p>
Es ist ganz gleich, ob ein Garten klein oder groß ist. <br>
Was die Möglichkeit seiner Schönheit betrifft, so ist seine Ausdehnung so
gleichgültig, wie es gleichgültig ist, ob ein Gedicht zehn oder hundert Zeilen
lang ist.<br>
Die Möglichkeiten der Schönheit, die sich in einem Raum von fünfzehn Schritten
im Geviert, umgeben von vier Mauern entfalten können, sind einfach unmessbar.</p>
<p>
Du brauchst einen Baum, du brauchst ein Haus, keines für Dich allein, nur einen
Winkel im Dach zu sitzen, zu denken, zu schlafen, zu träumen, zu schreiben, zu
schweigen, zu sehen den Freund, die Gestirne, das Gras, die Blume, den Himmel.<br>
Reizend ist es, still und gemächlich übers Land zu gehen und von ernsten, starken
Bäuerinnen freundlich gegrüßt zu werden.</p>
<p>Ein solcher Gruß tut wohl wie der Gedanke an die Unvergänglichkeit. Es öffnet sich
ein Himmel, wenn Menschen freundlich miteinander sind. Der Mensch ist inmitten der
Natur immer das Kind an sich. Das Kind träumt wohl einmal einen schweren
beängstigenden Traum, wenn es aber die Augen aufschlägt, so sieht es sich immer wieder
im Paradies.</p>
<p>
Man kann einen seligen, seligsten Tag haben, ohne etwas anderes dann zu gebrauchen, als
blauen Himmel und grüne Erde. Denn ein Garten ist Ausdruck menschlichen Bestrebens, die
Natur zu zähmen & zu ordnen; steht aber gleichsam für die Symbiose aus Phantasie und
Perfektion.</p>
<p>(Nach von Hoffmannsthal, Mayröcker, Walser, Nietzsche und Paul)</p>
EOT;
function mark_hits($text, $search, $colors=false)
{
$tmp = array();
foreach ($search as $s) {
$s = trim($s);
if ($s=='') {
continue;
}
$tmp[] = preg_quote($s);
}
if(!$tmp) {
return "Keine Suchebegriffe";
}
$w = '('.join('|',$tmp).')';
$n = 50;
$r = 5;
$max = 30;
$text = strip_tags($text);
$dummy = preg_match_all("#(\b(.{0,$n}$w){1,$r}?(.+\b){0,4}?)#Usi",$text, $matches);
if ($dummy) {
$nbr = count($matches[1]);
$result = '';
for ($i=0;$i<$nbr;$i++) {
if ($i==$max) {
break;
}
$result .= '... '.mark_words($matches[1][$i],$search,$colors).' ...<hr />';
}
} else {
$result = "Die Suche nach <em>".join(' ',$search)."</em> lieferte keine Treffer.";
}
return $result;
}
function mark_words ($text, $words, $colors = false)
{
$tmp = array();
if (!$colors) {
$colors = array('#ff9999', '#ffff99', '#ff99ff', '#99ffff','#99ff99');
}
$c = 0;
foreach ($words as $w) {
$w = preg_quote(trim($w));
if($w=='') {
continue;
}
$regexp = "/($w)(?![^<]+>)/i";
$replacement = '<b style="background-color:'.$colors[$c].'"></b>';
$text = preg_replace ($regexp,$replacement ,$text);
$c++;
if ($c >= count($colors)) {
$c=0;
}
}
return $text;
}
$search = 'Himmel Tag Mensch';
if (array_key_exists('search', $_POST)){
$search = $_POST['search'];
}
// ggf. automatisch ergaenzte Backslashes entfernen ...
if (get_magic_quotes_gpc()){
$search = stripslashes($search);
}
$searchwords = explode(' ', $search);
echo mark_words($example, $searchwords);
echo '<hr>';
echo mark_hits($example, $searchwords);
$search = htmlentities($search);
echo <<< EOT
<form method="post" action="{$_SERVER['PHP_SELF']}">
<input type="text" name="search" value="$search">
<input type="submit" value="suchen">
</form>
EOT;
?>
Dieses PHP Snippet soll in erster Linie als Beispiel und Anregung für eigene Bemühungen dienen.
Gerne darf man es für Projekte aller Art benutzen.
Möchte jemand das Snippet also solches in ähnlicher oder anderer Form veröffentlichen ist ein kleiner Hinweis auf simplecontent.net nicht zuviel verlangt oder Herr Koch?
Für die Abwesenheit von Fehlern kann natürlich keine Gewähr gegeben werden.