simplecontent

PHP Snippets und Beispiele

Inhaltsverzeichnis A-Z Register
Beispiel ausführen

Suchergebnisse hervorheben (Beispiel 2)

Wörter einer Suchanfrage farbig hervorheben

Man kennt das u.a. von Google. Mehrere Suchbegriffe werden durch unterschiedliche Farben hervorgehoben. Dabei dürfen innerhalb von HTML-Tags natürlich keine Ersetzungen vorgenommen werden. Die Annahme ist, dass wenn der Suchbegriff von einem > gefolgt wird, er innerhalb eines solchen Tags steht und daher ignoriert werden muss. Das erledigt im Beispiel folgender reguläre Ausdruck.
		$regexp = "/($w)(?![^<]+>)/i";
In der PHP-FAQ findet man eine weitere Lösungsvariante dieser Aufgabe. Diese kommt ohne look ahead aus. Allerdings war das Beispiel dort bei einem Benchmarktest ungefähr um den Faktor vier langsamer. Das PHP Code Beispiel:
<?php
/**
* Mehrere Wörter verschiedenfarbig hervorheben
*/

function mark_words ($text$words$colors false)
{
    
// wenn kein Array mit Farbangaben übergeben wird ...
    // ... diese Standardfarben verwenden

    
if (!$colors || !is_array($colors) ) {
        
$colors = array('#ff9999''#ffff99''#ff99ff''#99ffff','#99ff99');
    }

    
$c 0;

    
// Schleife über alle Suchbegriffe
    
foreach ($words as $w) {

        
// ggf. Metazeichen im Suchbegriff escapen
        
$w preg_quote(trim($w));

        if(
$w=='') {
            continue;
        }

        
$regexp "/($w)(?![^<]+>)/i";

        
$replacement '<b style="background-color:'.$colors[$c].'">\1</b>';

        
$text preg_replace ($regexp,$replacement ,$text);

        
$c++;
        if (
$c >= count($colors)) {
            
$c=0;
        }
    }
    return 
$text;
}

$example = <<< EOT
Um unterschiedliche Suchbegriffe bei einer Suchanfrage kenntlich zu machen, werden
diese häufig bei der Trefferanzeige farbig hervorgehoben.
Dies ist ein Beispiel dafür.
Jeder der Suchbegriffe wird dabei mit einer anderen Farbe hervorgehoben.
Ist eigentlich ganz einfach, aber der Effekt ist doch toll oder?
EOT;

$search = array('Suchbegriffe','ist''der');

echo 
mark_words($example$search);

?>

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.