Квартиры, дома, земельные участки Краснодарского края без посредников. Объявления собственников недвижимости.
Реклама здесь
Главная
Примеры PHP Примеры JavaScript Примеры Ajax Примеры CSS,HTML

Универсальный поиск по сайту на PHP

В данной статье я хотел бы поделиться с вами опытом в программировании на php, и показать, как можно довольно просто организовать поиск по-вашему сайту.

Для начала нам понадобится создать список файлов, в которых мы будем искать нужное слово или сочетание нескольких слов. Для этого создадим файл files.dat с именами файлов, в которых будет осуществляться поиск.

Как пример: file1.txt dir1/file2.txt dir2/file3.txt ... dirn/filen.txt

Для поиска можно использовать следующие функции: ereg и eregi а также функции поиска вхождений регулярных выражений и их преобразования ereg_replace и eregi_replace. Ereg отличается от eregi только тем, что первая ищет без учета регистра символов, а вторая их учитывает. Но так как мы будем осуществлять поиск в текстовых или html файлах предпочтительней для нас использовать подсветку искомых слов в выводимом результате, ак как это делают многие поисковые системы, и для этого мы воспользуемся двумя последними функциями, т.е. ereg_replace и eregi_replace.

Чтобы найти вхождение слова в строку, а именно так мы в дальнейшем представим наши файлы функции поиска, нам нужно составить правильное регулярное выражение, т.е. как бы составит запрос понятный функциям ereg_replace и eregi_replace. Для этого нужно немного изучить синтаксис регулярных выражений, но этим вы сможете заняться как-нибудь на досуге, а в данном случае будет что-то вроде этого: "\0", т.е. здесь я использовал теги и для выделения найденных слов, вы можете использовать любые другие теги. В результате наша функция пока будет выглядеть так:


<?php
// $text - текст в котором ищем
// $search_text - искомые слова
// $use_register - использование регистра
function search($text$search_text$use_register=false)
{       
  if (
$use_register// если учитывать регистр символов
  
{
  return 
ereg_replace($search_text,"<b>\0</b>",$text); // ищем, заменяем, возвращаем
  
}
  else 
// если не учитывать регистр символов
  
{
  return 
eregi_replace($search_text,"<b>\0</b>",$text); // ищем, заменяем, возвращаем
  
}
return 
$result// так, на всякий случай
}
?>
Скопировать в буфер

Можно так же написать еще одну функцию, для чтения файла (можно использовать в качестве пути URL к файлу) в строку:


<?php
// $url=~"http://sitename.ru filename /";
// или
// $url=~"ftp://user:pass@sitename.ru/filename";
//или
//$url=~" filename";
function Remote_file_read($url)
{
$text="";
$file = @fopen ($url"r");
if (!
$file) {
    return 
"-1";
    echo 
"EROR"//можно удалить
    
exit;
}
while (!
feof ($file)) {
    
$line fgets ($file1024);
    
$text.=$line;
    }
fclose($file);
return 
$text;

?>
Скопировать в буфер

Функцию поиска мы написали, теперь осталось написать код для поиска, он будет выглядеть примерно так:


<?php
$files_file
="files.dat";
$obrezanie=100//обрезание строки по длинне
// $text - текст в котором ищем
// $search_text - искомые слова
// $use_register - использование регистра
function search($text,$search_text,$use_register=false)
{
  if (
$use_register)
  {
  return 
ereg_replace($search_text,"<b>\0</b>",$text);
  }
  else
  {
  return 
eregi_replace($search_text,"<b>\0</b>",$text);
  }
return 
"";
}

function 
Remote_file_read($url)
{
$text="";
$file=@fopen ($url"r");
if (!
$file) {
    return 
"READ EROR";
    exit;
}
while (!
feof ($file))
    {
    
$line=fgets ($file1024);
    
$text.=$line;
    }
fclose($file);
return 
$text;
}

function 
Cut_string($text,$search_text// Функция обрезающая текст
{
  global 
$obrezanie;
  
$p=strpos($text"<b>".$search_text."</b>");
  
$p=$p-$obrezanie;
  if (
$p<0$p=0;
  
$text=substr($text,$p,$obrezanie*2+strlen("<b>".$search_text."</b>"));
  return 
$text;
}

 
// Выводим форму поиска
echo '<form name="f1" method="get" action="search.php">
<table align="center" cellpadding="0" cellspacing="0" width="70%"><tr>
<td width="35%"><p align="right">Что искать:</p></td><td width="368"><p>
<input type="text" name="Search_text" size="34" value=""></p>
</td></tr><tr><td width="368">
<p align="right">Как искать:</p></td><td width="368"><p>
<input type="radio" name="type" value="0">С учетом регистра<br>
<input type="radio" name="type" value="1">Без учета регистра</p>
</td></tr><tr><td width="527" colspan="2"><p align="center">
<input type="submit" value="Найти">&nbsp;</p></td></tr></table></form>'
;

if (isset(
$Search_text)) // Если слово для поиска заданно то идем дальше
{
$found=false;
if (!isset(
$type)) $type=1// Проверяем тип поиска
if ($type==0$use_register=true;
else
$use_register=false;
$file=file($files_file);
$count=count($file);
for (
$i=$i<$count $i++) // Проходим по всем файлам указанным в files.dat
      
{
      
$def_text=htmlspecialchars(Remote_file_read(trim($file[$i])));
      
$return_text=search($def_text,$Search_text,$use_register);
      if (
$def_text!==$return_text)
      {
      echo 
"<h3>".trim($file[$i])."</h3>";
      echo 
Cut_string($return_text,$Search_text);
      echo 
"<br><a href="".trim($file[$i])."">Открыть эту страницу</a>";
      echo 
"<br><hr><br>";
      }
      }
}
?>
Скопировать в буфер

Полученный код вы без проблем можете использовать на своем сайте, несмотря на его просту для большинства небольших сайтов его должно хватить. Основным недостатком кода является то, что при поиске в html файлах результат может выводиться не в особо-читаемой форме. Поэтому данный скрипт предназначен в основном для поиска в текстовых файлах.

Другой вариант поиска с учетом морфологии русского языка.

Проверенный системный блок HP 3400 Pro MT от диллера.

© Copyright 2008-2012 by KDG