$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.