Главная » Полезные статьи » Язык PHP » Поисковый механизм для вашего сайта на PHP
Распечатать статью

Поисковый механизм для вашего сайта на PHP

Представьте себе массу 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

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи