Требуется показать страницу, например результаты поиска, подсветив при этом некоторые слова.
Вызовите функцию preg_replace() с массивом шаблонов и массивом заместителей:
$patterns = array('\bdog\b/', '\bcat\b');
$replacements = array('<b style="color:black;background-color=#FFFF00">
dog</b>',
'<b style='color:black;background-color=#FF9900">
cat</b>');
while ($page) {
if (preg_match('{^([^<]*)?(</?[^>]+?>)?(.*)$}',$page,$matches)) {
print preg_replace($patterns,$replacements,$matches[1]);
print $matches[2];
$page = $matches[3];
}
}
Регулярное выражение, используемое функцией preg_match(), сопоставляет весь возможный текст до тега HTML, затем тег, а затем остальное содержимое. Текст до тега HTML подсвечивается, тег выводится
без какого-либо выделения, а остальное содержимое сопоставляется
таким же образом. Это предотвращает выделение слов внутри тегов
HTML (например, в URL или в тексте атрибута alt), что могло бы привести к некорректному отображению страницы.
Следующая программа извлекает содержимое URL и помещает его в
переменную $url и подсвечивает слова из массива $words. Слова не выделяются, если они являются частью более длинного слова, поскольку
они соответствуют Perl-совместимому оператору регулярного выражения \b для определения границ слова.
$colors = array('FFFF00','FF9900','FF0000','FF00FF',
'99FF33','33FFCC','FF99FF','00CC33');
// строим поиск и заменяем шаблоны регулярным выражением
$patterns = array();
$replacements = array();
for ($i = 0, $j = count($words); $i < $j; $i++) {
$patterns[$i] = '/\b'.preg_quote($words[$i], '/').'\b/';
$replacements[$i] = '<b style="color:black;background-color:#' .
$colors[$i % 8] .'">' . $words[$i] . '</b>';
}
// получаем страницу
$fh = fopen($url,'r') or die($php_errormsg);
while (! feof($fh)) {
$s .= fread($fh,4096);
}
fclose($fh);
if ($j) {
while ($s) {
if (preg_match('{^([^<]*)?(</?[^>]+?>)?(.*)$}s',$s,$matches)) {
print preg_replace($patterns,$replacements,$matches[1]);
print $matches[2];
$s = $matches[3];
}
}
} else {
print $s;
}