proview.ruКонструирование сайтовPHP → Подсветка текста на странице

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

Каким образом можно сделать подсветку текста на странице?

Для начала давайте определимся, каким образом мы будем подсвечивать текст и как будем узнавать, какой текст нужно подсвечивать.

Подсвечивать текст можно (самое простое) фоном. Напримёр, жёлтым. Сразу заметно, очень удобно. Ещё можно подчёркиванием, например таким. В общем, вариантов много. Я предлагаю не ограничивать вебмастера и просто необходимый текст заключать в блок:

<span class="highlight"> тут подсвеченный текст </span>

Стиль класса определяйте как хотите. Я, например, сделал так:

.highlight {

background-color: yellow;

}

Теперь о том, откуда мы будем узнавать, какие слова подсвечивать: это очень просто — мы будем передавать GET-запросом параметр highlight, равный подсвечиваемому тексту. Таким образом URL страницы станет таким:

http://www.site.ru/page.php?a=1&b=2&highlight=%E4%F3%F0%E0%EA

И мы легко сможем взять значение этой переменной из суперглобального массива $_GET. Ну, чтобы было удобнее разработчикам, разрешим также передавать параметр highlight методом POST и будем его брать из массива $_REQUEST.

Теперь о том, как же мы будем это делать. Для того, чтобы выделить необходимый текст на странице, нам нужно получить весь текст страницы. Для этого мы будем использовать функции контроля за выводом (а именно ob_start).

В самом начале Вашего PHP-скрипта, который занимается выводом страниц вставляется следующий код:

<?
if (isset($_REQUEST['highlight'])) ob_start('highlighter');

... // здесь идёт код страницы

Мы запускаем контроль за выводом и указываем, что обработкой всех выведенных данных будет заниматься функция highlighter. Теперь нужно определить и саму функцию highlighter. Простейший вариант выглядел бы так:

function highlighter ($data) {
$t=explode(' ', $_REQUEST['highlight']);
// получаем массив слов, которые нужно подсвечивать

foreach($t as $i)
$data=preg_replace('#' . $i . '#i', '<span class="highlight">$0</span>', $data);

return $data;
}

Увы, он содержит один очень важный недостаток: достаточно в параметре highlight передать имя любого тега (например, p, a или body) и всё сломается — он окружит теги <span>-ами. То же самое произойдёт и со значениями параметров тегов.

Единственный более-менее нормальный вариант, который я нашёл — сначала вырезать все теги вместе с атрибутами из страницы, а потом возвращать их на свои места. Таким образом функция highlighter изменяет свой вид на такой:

function highlighter ($data) {
$t=explode(' ', $_REQUEST['highlight']);
// получаем массив слов, которые нужно подсвечивать

// Убираем из текста все теги в массив $tagList
preg_match_all('#<[^>]*>#', $data, $tags); array_unique($tags);
$tagList=array(); $k=0;
foreach($tags[0] as $i) {
$k++;
$tagList[$k]=$i;
$data=str_replace($i, '<' . $k . '>', $data);
}

// Производим обрамление текста <span>-ами
foreach($t as $i)
if (!is_numeric($i))
$data=preg_replace('#' . $i . '#i', '<span class="highlight">$0</span>', $data);

// Возвращаем все теги на место
foreach($tagList as $k=>$i) $data=str_replace('<' . $k . '>', $i, $data);

// Убираем все подсветки внутри тегов <title> ... </title>
$data=preg_replace_callback(
'#<title>(.*?)</title>#',
create_function(
'$m',
'return preg_replace("#<span([^>]*)>#", "", str_replace("</span>", "", $m[0]));'
),
$data
);

return $data; // Возвращаем подсвеченный текст
}

Вот так мы и решили проблему с подсветкой слов. Метод, конечно, не идеален, но очень хорош.

Хочу заметить: по-умолчанию при поиске кодировка не учитывается. То есть если у Вас сайт в windows-1251 и данные для подсветки пришли в ней же, то всё будет отлично. Но если Ваш сайт в иной кодировке, или если данные приходят в неправильной кодировке, то ничего подсвечено не будет.

Например, у меня сайт в UTF-8, а все данные от параметра highlight приходят в windows-1251 — скрипт их сначала перекодирует в UTF, а уже потом делает подсветку.



Источник: http://webmastak.com

Популярное