Поиск внутри текста
Поиск будет происходит именно в контенте. Но к сожалению ни одну функцию PHP не смог заставить работать нормально.
В контенте некоторые тексты берутся из базы а некоторые считываются с файла.( функцией fread например).
Для поиска текста в большом тексте использовал следующие функции.
stristr(string haystack, string needle)
strstr(string haystack, string needle)
strpos(string haystack, string needle [, int offset])
Иногда работают с текстом взятом из базы НО с текстом которого прочел с файла никак не работают. У кого нибудь есть опыт с такой проблемой. Может написать свою функцию....:confused:
код пожалуйста.
А что именно не получается?
Каак всё криво. Не проще ли всё закинуть в MySQL5 БД и простой регулярочкой экстрактить уже отсортированные по релевантности результаты?
(функция 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("~&?~","~"?~");
$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>";
$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("~&?~","~"?~");
$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>";
Цепляешь функцию highlight и подсвечиваешь нужные слова.
Удачи!
$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)
Код:
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; //Найдено
}
{
$sub=substr($content,0,100); //Кусочек берем
echo "<p><a href='index.php?l=$l&t=$row[3]&u=1'>$sub</a></p>";
$found=1; //Найдено
}
если тебе уж так хочется.
Спасибо конечно но функция stristr по моему возвращает String типа значение а не bool. По крайней мере в справочнике написано так...:)
Цитата:
Return Values
Returns the matched substring. If needle is not found, returns FALSE.
Спасибо