Разработчику. Сборник рецептов PHP
Задавайте вопросы

Выделение информации на веб-странице

Вернуться назад

Задача

Требуется показать страницу, например результаты поиска, подсветив при этом некоторые слова.

Решение

Вызовите функцию 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;
}

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ