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.
<?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);
?>