Автор: 03.06.2001 - Arsen
Kirillov
Представьте себе массу 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("/[\\041-\\055\/]*/","",$s);
$s=preg_replace("/\./","\\\056",$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;} ).
|