Представьте себе массу HTML
документов лежащих в подкаталоге. Пускай ,например , это будет каталог
договоров вашей организации , перегнанный в html формат и лежащий на
интранет сервере вашей организации. Теперь представьте себе что договора
раскиданы по папкам. Папки имеют вложенные папки … Как в этом всем
разобраться — а разобравшись не потеряться опять ?
Очень просто Создайте поисковую систему по вашему сайту..
В этой статье пойдет речь о том как создать систему поиска по HTML
документам на интранет — сайте вашей организации или ( или веб — сайте).
Для начала о принципах работы системы.
Каждый HTML документ, который включается в такую систему, должен иметь
специальные мета — теги. Выбор их наименования зависит только от вас, но
желательно использовать нестандартные — для обеспечения возможности
корректировки ваших HTML документов стандартными средствами — например
FrontPage 2000. В принципе это требование не есть обязательным — так как
система поиска будет реагировать и на комментарии в тексте документа.
Однако удобнее все-таки применять стандартные средства создания
мета-тегов.
Итак с чего же начать ? Начать можно с того что ничего не меняя в
структуре вашей информации (месторасположении ваших файлов) , добавить в
ваши html-документы следующие мета — теги:
<html><head>
<meta docsort=»Договор»>
<meta docname=»Договор о совместной деятельности № 126 от 27.05.2001?.»>
..Тут идут другие теги……
</head> Итак вы видите следующие мета — теги (еще раз напомню что выбор
их имени полностью зависит от вас — но если вы хотите чтобы данная
система поиска заработала как есть то примените вышеприведенные)
* docname Здесь находиться описание вашего документа. Фактически поиск
идет по этому полю так что надо быть внимательным заполняя его. (Хоть
можно ввести и дополнительное поле поиска по ключевым словам ) )
* doctype — Вид документа . Здесь вы можете написать что-то вроде
кодифицированного вами типа документа например «Договор» , «Приложение»,
«Контракт» … По этому полю также ведется поиск (перед решающим
сравнением эти два поля «склеиваются» через пробел в одну строку)
* Кроме этих вы можете задействовать в поиске и другие мета теги.
Структура поисковой системы выглядит следующим образом :
* Форма поиска —> Get запрос —> программа на PHP выводящая результаты
поиска в виде HTML документа.
В качестве связующего звена при поиске используеться механизм GET
запроса. При котором строка поиска будет передана в строке адреса html
документа. Форма для поиска может быть самой простой , например :
<html>
<body>
<form name=»main» action=»find.php» method=»GET»>
<input size=»25″ name=»s» value=»php»>
<input type=submit value=»Поиск»>
</form>
</body>
</html>
Внешний вид формы поиска
Начало формы
Конец формы
После того так вы нажимаете на кнопку «Поиск» переменная «s» через GET
запрос отправляется в программу поиска написанную на PHP. В этой
программе используеться «готовый» класс , в котором собственно и
сосредоточена вся функциональность поисковой системы.
Приведем сокращенный текст класса поисковой системы (который удобно
разместить в отдельном файле вместе с функциями использующимися в этом
классе).
//Исходный текст можно Скачать на сайте «Программы для Бизнеса».
class search{
//Переменные класса пропущены см. в архиве
function close_search()//Пропущена см. в архиве
//====Рекурсивный проход по каталогу====
function return_htmls($s_in_dir,$what_meta_name,$in_meta_name)
{
//Исключаем служебные каталоги FrontPage
if (preg_match(«/_vti[.]*/i»,$s_in_dir)){return;}
if ($dir_handle = @opendir($s_in_dir))
{
while($file = readdir($dir_handle))
{
//Рекурсивный проход по директориям если текущий файл — это директория
if ($file!=»..» && $file!=».» && is_dir($file))
{
$this->return_htmls($s_in_dir.»/».$file,$what_meta_name,$in_meta_name);
}
//Проход по *.ht* файлам в одной директории
if (!is_dir($file) && $file!=»..» && $file!=».» &&
preg_match(«/[.]*\.ht[.]*/i»,$file))
{
// Получаем мета-тег docsort
// Функция cyr_up (см. В архиве ) служит для приведения
// маленьких символов кириллицы к прописным и для
// замены совпадающих символов кириллицы и латинского алфавита
// на латинские прописные
$str_meta_sort=cyr_up(GetMeta(«docsort»,$s_in_dir.»/».$file));
//Если задан поиск по мета-тегам (иначе не будет поиска)
//Введено для возможности расширения функций программы
if ($in_meta_name){
//Имя без типа — для вывода
$str_meta_name=cyr_up(GetMeta(«docname»,$s_in_dir.»/».$file));
//Включаем тип документа — для поиска
$str_meta_name1=$str_meta_name.» «.$str_meta_sort;
//Создаем массив токенов (слов) из входного запроса (переменной формы)
$token_arr=split(‘[+ ]‘,$what_meta_name);
//Убиваем повторяющиеся токены
$token_arr=array_keys(array_count_values($token_arr));
//Количество присутствующих в строке токенов
$tok_founded=0;
//Всего токенов найдено
$all_founded=0;
//Поиск
for ($j=0;$j<count($token_arr);$j++)
{
if
($all_founded+=preg_match_all(«/».cyr_up($token_arr[$j]).»/i»,cyr_up($str_meta_name1),$matches_arr))
$tok_founded++;
}
//Вывод токенов
if ($tok_founded==count($token_arr) && strlen(trim($what_meta_name))!=0
&& strlen(trim($str_meta_name))!=0){
//Тут выделяем токены красным цветом
for ($j=0;$j<count($token_arr);$j++)
{
$str_meta_name=preg_replace(«/(«.cyr_up($token_arr[$j]).»)/i»,»<font
color=\»red\»>\\1</font>»,cyr_up($str_meta_name));
$str_meta_sort=preg_replace(«/(«.cyr_up($token_arr[$j]).»)/i»,»<font
color=\»red\»>\\1</font>»,cyr_up($str_meta_sort));
}
echo «<li><p class=\»B\»><a class=\»n\»
href=\»".$s_in_dir.»/».$file.»\»>/$this->count.<b>$str_meta_sort</b>
\»$str_meta_name\» /$all_founded/</a></li><br></p>\n»;
$this->found_in_metaname++;
$this->count++;
}
}
}
}
closedir($dir_handle);
}
}
//end class
}
?>
<html>
<link rel=»stylesheet» type=»text/css» href=»css/sm.css»>
<body>
<?
$qu = getenv(«QUERY_STRING»);parse_str(substr($qu,0,100));
if (!isset($s)){$s=»";};
//echo ();
$s=preg_replace(«/[\41-\55\/]*/»,»",$s);
$s=preg_replace(«/\./»,»\\56″,$s);
$show=new search;
$show->count=1;
$show->found_in_metaname=0;
$show->return_htmls(«.»,$s,1);
$show->close_search();
?>
</body>
</html> Для перебора всех файлов в каталоге класса
return_htmls(«.»,$s,1); В качестве параметров ей передаеться имя
начального каталога (с которого начинать обход) , поисковая строка и
флаг (поиск в мета — тегах) который должен быть равен 1 — для поиска в
мета тегах.
* Алгоритм работы функции следующий:
Функция проходит текущий каталог и если находит файл то берет его мета-
теги и ищет в них ключевые слова. Поиск ведеться с помощью RegExp -ов
следующим кодом:
//Поиск
for ($j=0;$j<count($token_arr);$j++)
{
if
($all_founded+=preg_match_all(«/».cyr_up($token_arr[$j]).»/i»,cyr_up($str_meta_name1),$matches_arr))
$tok_founded++;
}
Функция preg_match_all производит Perl-совместимый полный поиск в мета
- тегах документа ( $str_meta_name1)
* Если слова найдены то выводит производиться «подсветка» мета-тегов с
помощью :
for ($j=0;$j<count($token_arr);$j++)
{
$str_meta_name=preg_replace(«/(«.cyr_up($token_arr[$j]).»)/i»,»<font
color=\»red\»>\\1</font>»,cyr_up($str_meta_name));
$str_meta_sort=preg_replace(«/(«.cyr_up($token_arr[$j]).»)/i»,»<font
color=\»red\»>\\1</font>»,cyr_up($str_meta_sort));
}
Используется функция функция замены по регулярному выражению
preg_replace () которая производит замену найденых токенов на них же
только выделенных красным цветом (<font color=\»red\»>\\1</font>)
* и вывод в html ссылки на документ. В конце выводиться количество
найденых токенов в мета — тегах документа.
* Если же файл являеться директорией то функция вызывает саму себя но в
качестве параметров передает уже новое имя директории + флаги поиска :
if ($file!=»..» && $file!=».» && is_dir($file))
{
$this->return_htmls($s_in_dir.»/».$file,$what_meta_name,$in_meta_name);
}
* Цикл продолжается пока не будут пройдены все файлы и каталоги
указанные при вызове функции.
Поиск ведеться по нескольким словам. Для разбиения поисковой фразы на
токены (слова) применяется следующий код:
* //Создаем массив токенов (слов) из входного запроса (переменной формы)
$token_arr=split(‘[+ ]‘,$what_meta_name);
* //Убиваем повторяющиеся токены
$token_arr=array_keys(array_count_values($token_arr));
Повторяющиеся токены забираются как для того чтобы ускорить поиск , -так
и для того чтобы не было ошибок при выделении токенов в результатах
поиска.
* Ссылки по теме:
- Текст скриптов из данной статьи можно взять в архиве сайта Скачать
>>>
- Статьи по PHP на сервере «Программы для бизнеса» Перейти >>>
- Раздел «ИнтраNET» на сервере «Программы для бизнеса» Перейти >>>
- Раздел «Программирование» на сервере «Программы для бизнеса» Перейти
>>>
В конце статьи хочется отметить что программа работает как на Windows
так и на UNIX , благодаря применению функций приведения мета-тегов и
строки запроса к верхнему регистру. Кроме того из поиска исключаться
стандартные каталоги FrontPage 2000 (с помощью: if
(preg_match(«/_vti[.]*/i»,$s_in_dir)){return;} ).
Источник: codingrus.ru