Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск внутри текста

514
04 сентября 2007 года
swordholder99
165 / / 11.12.2006
На своем сайте я хотел бы поставить "Поиск по сайту".
Поиск будет происходит именно в контенте. Но к сожалению ни одну функцию PHP не смог заставить работать нормально.
В контенте некоторые тексты берутся из базы а некоторые считываются с файла.( функцией fread например).
Для поиска текста в большом тексте использовал следующие функции.
stristr(string haystack, string needle)
strstr(string haystack, string needle)
strpos(string haystack, string needle [, int offset])

Иногда работают с текстом взятом из базы НО с текстом которого прочел с файла никак не работают. У кого нибудь есть опыт с такой проблемой. Может написать свою функцию....:confused:
92
04 сентября 2007 года
Тень Пса
2.2K / / 19.10.2006
и как же это они не работают с текстом прочитанным из файла? =)

код пожалуйста.
251
04 сентября 2007 года
SkyMаn
1.7K / / 31.07.2007
А что именно не получается?
239
05 сентября 2007 года
Dolonet
1.7K / / 20.05.2000
Каак всё криво. Не проще ли всё закинуть в MySQL5 БД и простой регулярочкой экстрактить уже отсортированные по релевантности результаты?
15K
05 сентября 2007 года
gruz0
71 / / 23.11.2006
Создаем индекс файл и потом делаем поиск по нему:
(функция sw пренадлежит не мне, сразу говорю)
Код:
$ttt=microtime();
    $ttt=((double)strstr($ttt, ' ')+(double)substr($ttt,0,strpos($ttt,' ')));
   
    $category = array("news","publish","events"); // у меня организовано категориями, которые располагаются в директории сайта /news/, /publish/, /events/, в них шаблоны файлов
   
    $indexdir="../upload/"; #индексируемая директория
    $indexfile="../upload/search.index"; #файл, в котором будет лежать индекс
   
    $abort = ignore_user_abort(1);
    set_time_limit(600);
   
    // Функция, удалающая слова, короче 3х букв. Пригодится дальше.
    function sw (&$item1, $key) { if (strlen($item1)<3) $item1=""; }
   
    $fullfile = "";
   
    for($i=0;$i<sizeof($category);$i++) {
        $directory = $indexdir.$category[$i];
        $handle=opendir($directory);
       
        while (false!==($file = readdir($handle))) {
            if ($file!="." && $file!=".." && ereg("(events|publish|news)_([0-9]+)\.html",$file)) {
       
                $fd = fopen ($directory."/".$file, "r");
                $contents = fread ($fd, filesize ($directory."/".$file));
                fclose ($fd);
       
                $contents=preg_replace ("~\n~"," ", $contents);
                $contents=preg_replace ("~\r~"," ", $contents);
               
                $contents=strip_tags ($contents);
               
                $contents=str_replace (' -', ' ', $contents);
                $contents=str_replace ('.', ' ', $contents);
                $contents=str_replace (',', ' ', $contents);
                $contents=str_replace ('!', ' ', $contents);
                $contents=str_replace ('?', ' ', $contents);
                $contents=str_replace (':', ' ', $contents);
                $contents=str_replace (';', ' ', $contents);
                $contents=str_replace (')', ' ', $contents);
                $contents=str_replace ('(', ' ', $contents);
                $contents=str_replace ('"', ' ', $contents);
               
                $replace = array("~&amp;?~","~&quot;?~");
                $contents=preg_replace($replace,"",$contents);
               
                $contents=strtolower ($contents);
               
                $contents=preg_replace("~\[\/?([^\]]+)\]~i",'',$contents);
                $contents=preg_replace("~\<\/?([^\>]+)\>~i",'',$contents);
               
                $contents=str_replace(" "," ",$contents);
               
                $contents=trim($contents);
               
                // разбиваем на слова, убираем слова, короче 3х букв
                $contents=explode (" ", $contents);
               
                // вот и функция пригодилась...
                array_walk ($contents, 'sw');
               
                $contents=array_unique ($contents);
               
                $contents=implode (" ", $contents);
               
                $contents=trim($contents);
               
                $fullfile.=$category[$i]."|".$file."|".$contents."\n";
               
                //echo ($file." проиндексирован<br>");
            }
        }
        closedir($handle);
    }
   
    // убираем двойные пробелы
    //while (stristr($fullfile, " ")) $fullfile=str_replace (" "," ",$fullfile);
   
    $fullfile=str_replace(" "," ",$fullfile);
   
    // индекс готов, сохраняем его
    $fp = fopen($indexfile, "w+") or die("can't open file");
    fwrite($fp, $fullfile);
    fclose($fp);
   
    // считаем, как долго работал скрипт
            $ddd=microtime();
    $ddd=((double)strstr($ddd, ' ')+(double)substr($ddd,0,strpos($ddd,' ')));
   
    echo ("<div align=center>Индексация завершена!<div class='index'>Время индексации: ".(number_format(($ddd-$ttt),3)).
          " секунд<br>");
    echo ("Размер индекса: ".(number_format((round ((filesize($indexfile))/1024)) ,
          0, ".",".")))." Kb</div></div>";
15K
05 сентября 2007 года
gruz0
71 / / 23.11.2006
Далее пишешь функцию поиска в индекс-файле и вуаля - поиск у нас как на ладони :)
Цепляешь функцию highlight и подсвечиваешь нужные слова.

Удачи!
2.0K
05 сентября 2007 года
swordholder
99 / / 17.10.2006
:( Я написал алгоритм поиска простым методом. То работает то нет. С текстом взятом с файла ни разу не сработал.

$found=0;
while($row=mysql_fetch_row($result)) //Поиск в записях из базы
{

$content="";
$size=0;
$search_text=" ".$search_text." "; //Текст которого ищем
//taking the content from file
if($row[6]!="") //Если путь файла существует берем контент с файла
{
$fp=fopen($row[6],"r");
$size=filesize($row[6]); //now $size var has number of chars
$content=fread($fp,$size);
}

//Или берем контент с базы
elseif($row[5]!="") //content
{
$content=$row[5];
$size = strlen($content);
$search_up=1;
} //end else


$content=strip_tags($content);//Избавляемся от HTML тегов
$pos=strpos($content,$search_text);
if($pos!="")
{
$sub=substr($content,0,100); //Кусочек берем
echo "<p><a href='index.php?l=$l&t=$row[3]&u=1'>$sub</a></p>";
$found=1; //Найдено

}

} //end while

if($found==0)
{
echo "Текст <b>'$search_text'</b> не был найден.<br>Пожалуйста введите слово/слова с учетом регистра.";
}//end if($found==0)
92
05 сентября 2007 года
Тень Пса
2.2K / / 19.10.2006
 
Код:
if(stristr($content, $search_text) !== FALSE)
{
  $sub=substr($content,0,100); //Кусочек берем
  echo "<p><a href='index.php?l=$l&t=$row[3]&u=1'>$sub</a></p>";
  $found=1; //Найдено
                   }



если тебе уж так хочется.
514
05 сентября 2007 года
swordholder99
165 / / 11.12.2006
Спасибо конечно но функция stristr по моему возвращает String типа значение а не bool. По крайней мере в справочнике написано так...:)
15
05 сентября 2007 года
shaelf
2.7K / / 04.05.2005
Пожалуйста огромное, но читаем внимательно ман
Цитата:

Return Values

Returns the matched substring. If needle is not found, returns FALSE.

514
05 сентября 2007 года
swordholder99
165 / / 11.12.2006
Спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог