Иногда для сайтов нужен свой простой поисковый механизм. Механизм это хорошо, но он состоит из различных частей. И вот сегодня мы рассмотрим одну из них.
Допустим у нас страницы хранятся в базе данных. Когда делается поисковый запрос, обращение идёт к базе, и если обращение успешно, то изымается содержимое страницы. И вот дальше нужно выбрать участок текста с найденным словом/фразой, чтобы человек смог сориентироваться - то он нашёл или нет. Как это делается?
$find = 'Искомое слово';
$symbolls = '80';
$search_text = 'Переменная с туевой хучей текста, содержащая "Искомое слово"';
$search_text = strip_tags($search_text, '<br><strong>');
$search_txt_length = strlen ($search_text);
$search_first_enter = strpos (strtolower($search_text), strtolower($find));
$pad_left = $search_first_enter-$symbolls;
$pad_right = $search_first_enter+$symbolls+5;
if ($pad_right>$search_txt_length) $pad_right = $search_txt_length;
if ($pad_left<0) $pad_left = '0';
$search_text = substr($search_text, $pad_left, $pad_right);
$fst_nbsp = strpos($search_text, " ");
$lst_nbsp = strrpos($search_text, " ");
$search_text = substr($search_text,$fst_nbsp,$lst_nbsp-$fst_nbsp);
$search_text = str_replace (strtolower($find),"<b>".strtolower($find)."</b>",strtolower($search_text));
?>
<div><b>...</b> <?=$search_text?> <b>...</b></div>
-
Строка 2. Переменная $find содержит искомое слово или фразу.
-
Строка 3. Переменная $symbolls. Количество символов, которое будет взято из текста до искомого слова и после.
-
Строка 4. Переменная $search_text. В ней хранится извлечённый из базы текст страницы.
-
Строка 6. Убираем из записи все HTML-теги, кроме тега переноса строки - br и тега толстого шрифта - strong. Можно добавлять и другие теги, но я на самом деле даже бы убрал один тег, а именно стронг. Дело в том, что если не усложнить код, то может возникнуть случай, когда после обрезания текста останется только открывающий тег, а закрывающего не будет, и в итоге всё будет плохо, например, всё жирное. Желающие могут к коду дописать несколько строк проверки на нужные теги, но думаю оно того не стоит=).
-
Строка 7. В переменной $search_txt_length хранится длина всего текста страницы.
-
Строка 8. Переменная $search_first_enter - номер символа в тексте, который показывает первое вхождение искомого слова. Применена функция strtolower, чтобы исключить влияние регистра на поиск.
-
Строки 10-11. Переменные $pad_left и $pad_right. Номера символов в тексте, которые предшествуют символу первого вхождения искомого слова ($search_first_enter), и идут после самого слова. Собственно эти две переменных и определяют откуда до куда будет выведена фраза. В отступе справа добавлено пять символов - компенсация за то, что отступ справа ведётся не с конца искомого слова/фразы, а с начала. Конечно, можно ввести переменную длины искомой фразы и тут её использовать, но это усложнит обучающий код. Энтузиастам флаг в руки=).
-
Строки 12-13. Поправки к двум предыдущим переменным. Ведь вдруг мы отсчитаем символы так, что будут минусовые или превышающие значения? Делаем две проверки.
-
Строка 14. УРА! Обрезаем искомый текст до нужного нам размера при помощи функции substr.
-
Строки 15-17. Текст обрезали, но почти наверняка там будут обрезаны некоторые слова. Поэтому надо обрубить эти обрубки слов. Сначала ищем вхождения первого и последнего пробелов при помощи функций strpos и strrpos, которые отличаются только тем, что первая ведёт поиск с начала строки, а вторая - с конца. Обращаем внимание на функцию substr, а точнее на третье значение, которое она принимает (до куда обрубать). Оно идёт с вычетом первого, так как сначала обрубается первая часть, а потом исходя из неё обрубается вторая часть.
-
Строка 18. Ну и теперь находим в обрезанном участке нужный кусок фразы и выделяем его жирным, мы же его искали, не так ли?
-
Строка 22. Выводим всё хозяйство пользователю.
Скачать данный код можно архивом
В заключении
Так что ничего сложного нет. При желании можно код совершенствовать и дописывать. Возможно где-то я использовал не самые простой способ достижения чего-либо, однако это делает также наглядным пример работы с функциями обработки текстовых строк на PHP. В общем пользуйтесь на здоровье=).
Похожие записи:
- Функции PHP для работы со строками (substr, str_replace, strpos и др.)
- Как защититься от xss атаки и устранить уязвимость
- Скрипт меню с контентом “почти как флэш” своими руками. Часть 1. Вёрстка.
- Как изменить размер изображения на PHP? Часть 2: Создаём миниатюры thumbnails
- С наступающим Новым 2011 годом!
18/12/2009 at 12:14 Постоянная ссылка Цитировать
Опробовал, хорошая штука. Спасибо=)
19/12/2009 at 0:23 Постоянная ссылка Цитировать
Всегда пожалуйста=)
26/01/2010 at 2:24 Постоянная ссылка Цитировать
Для таких задач придумали регулярные выражения.
echo preg_replace('/(.{0,'.$symbolls.'})('.$find.')(.{0,'.$symbolls.'})/i', '$1$2$3', $search_text);
Это грубое приближение, но суть, думаю, ясна. Ваш код можно сократить в пять раз.
26/01/2010 at 2:28 Постоянная ссылка Цитировать
Сайт съел html-теги, присутствующие в коде.
$1$2$3 следует читать как $1$2$3 (без пробелов)
26/01/2010 at 2:30 Постоянная ссылка Цитировать
опять съел =)
26/01/2010 at 10:28 Постоянная ссылка Цитировать
Хммм, понятно, действительно можно код как следует сократить, не используя кучу строковых функций. Когда писал код, так и думал, что чего-то упускаю и что есть более простой вариант=).
Спасибо за инфу, всегда приятно получать указатель в другую сторону, чтобы заметить то, что было пропущено.
28/02/2010 at 21:57 Постоянная ссылка Цитировать
Пример хотелось бы увидеть
01/03/2010 at 0:42 Постоянная ссылка Цитировать
код из журнала залил в архиве – чтобы не заморачиваться с заменой кавычек – можно качать, линк в тексте