simplecontent

PHP Snippets und Beispiele

Inhaltsverzeichnis A-Z Register
Beispiel ausführen

Suchergebnisse hervorheben (Beispiel 3)

Wörter einer Suchanfrage farbig hervorheben

Hier eine Kombination aus den beiden vorherigen Beispielen. Neben der farbigen Markierung der Suchbegriffe wird auch jeweils die Fundstelle auszugsweise wiedergegeben. Das PHP Code Beispiel:
<?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.