(Первоначальноя название - "Поисковик в кармане - ищем по текстовым файлам" показалось мне неподходящим)
Здравствуйте, уважаемые посетители сайта
http://web-maste.ru!
Известно, что с человеческой точки зрения просматривать огромное количество страниц в поисках информации-дело трудоемкое, нудное и раздражающее. А если ваш сайт обладает ценнейшей базой по разведению кактусов? А если она разделена на СОТНИ html-страниц с ничего не говорящим названием? А найти информацию хочется, так что же делать? Просматривать все вручную?Нет, "если гора не идет к Магомеду, то Магомед идет к горе". Мы напишем скрипт, позволяющий отыскать информацию по HTML файлам в папке, не прибегая ни к каким сторонним программам.
Я не любитель длинных раглагольствований по поводу кода, я сразу вам его приведу, пояснив внутри кода почти каждую строчку комментариями.
Итак, запускайте ваш сервер, открывайте "Блокнот" и давайте приведем вашу кучу виртуальных бумаг в порядок:
<?php
$folder="notemplates/";//папка для поиска, в ней должны лежать
ТОЛЬКО html документы, слеш в конце ОБЯЗАТЕЛЕН
$cut=100;//количество вырезаемых символов
// Далее идет часть скрипта, отвечающая непосредственно за поиск,
она будет выполняться ТОЛЬКО если пользователь отправил форму на сервер
echo "<form method='post'>";//выводим
echo "<input type='text' size=48 name='search'
value='" . (isset($_POST['search'])?$_POST['search']:'') . "'>";//форму
echo "<input type='hidden' name='submit' value='1'>
<input type='submit' value='Найти!'>";//поиска
if (!empty($_POST['submit'])) {//если в скрипт передана переменная submit, значит юзер хочет что-то найти..
$search = $_POST['search'];//на всякий случай, если отключены register_globals
$words = explode(" ", $search);//разделяем строку на массив слов
$dr=opendir($folder);//открываем папку для поиска
while($ff=readdir($dr)){//читаем каждый файл из открытой папки для работы с ним
$wrdcnt=0;//кол-во найденных совпадений
$string="";//контекст совпадения
if($ff=="." or $ff=="..")//пропускаем ссылки на текущую директорию
continue;//и ту, которая уровнем выше
$srch=strip_tags(file_get_contents($folder."$ff"),"title");//удаляем все теги из текста текущего файла.
foreach ($words as $v){//цикл для каждого слова
$start=0;//начало вырезки контекста
$end=0;//конец вырезки контекста
if(eregi("$v",$srch)){//проверяем, есть ли текущее слово в тексте страницы
$start=strpos($srch,$v)-$cut;//вычисляем начало контекста-позиция слова минус количество вырезаемых символов ^^^
if($start<0)//нам не нужны отрицательные позиции, т.к. вырезка в этом случае
будет идти с конца
$start=0;//поэтому будем считать что вырезаем с нуля.
$end=strpos($srch,$v)+$cut;//вычисляем конец контекста-позиция слова плюс количество вырезаемых символов ^^^
$string.="<font color='green'>...</font>";//добавляем многоточие
$string.=eregi_replace($v,"<b style='background:yellow;color:red;'>$v</b>",substr($srch,$start,$end+strlen($v)));//substr-вырезаем кусок из текста страницы от $start до $end.eregi_replace-заменяем в тексте совпадения выделением
$string.="<font color='green'>...</font>";//добавляем к концу контекста
$wrdcnt++;//так как слово найдено, то увеличиваем счетчик совпадений.
}//конец if
}//конец foreach
if($wrdcnt!=0){//если количество совпадений не равно 0...
echo "<a href='".$folder."$ff'>$ff</a><br>";//то выводим ссылку на
найденную страницу
echo $string;//выводим контекст
echo "<br><br>";//отделяем результаты друг от друга
}
}
}
?>
Вот и все.
А теперь товарищи, партийное задание-модернизируйте скрипт!
Вот некоторые идеи:
1.Пробуйте вырывать из текста страницы заголовок(<title<>/title<) и выводить его вместо имени файла.
2.Сделайте скрипт рекурсивным(TIP:вынести поиск в функцию и вызывать её для каждой папки).
3.Сделайте возможность выбора между поиском слова целиком или в любом месте(смотрите условие с eregi)
4.Задание для умных:попробуйте опеределить и вывести релевантность документа, и отсортировать по ней.
З.Ы.:пожалуйста, если используете скрипт с ОЧЕНЬ большим количеством страниц, дайте мне ссылку на сайт, очень уж хочется посмотреть
Удачи!