Знаю что существует множество готовых php скриптов поиска, но я решил написать что-то свое, может быть я не изобрел велосипед, но такого я просто нигде не видел, как мне кажется он достаточно удобен для пользователя.
его работу можно посмотреть на сайте http://www[dot]mpk-ekb[dot]ru набрав в строке поиска КОМП (например)
PHP:
скопировать код в буфер обмена
$pa=Array(); // массив из путей к файлам (страницам) $ca=Array(); // массив названий страниц для формирования списка $pa[1]="page1.php"; $ca[1]="Страница 1"; $pa[2]="page2.php"; $ca[2]="Страница 2"; $pa[3]="page3.php"; $ca[3]="Страница 3"; $count_pages_for_search=3; // кол-во страниц для поиска setlocale(LC_ALL , 'ru_RU.CP1251'); // чтобы strtoupper работал для кириллицы $word=$_POST['word']; // переданное из формы слово для поиска $word=strtoupper($word); // слово для поиска в верхний регистр $captions=Array(); // массив названий страниц где слово найдено $count_pages=0; // счет страниц где слово найдено // цикл поиска for($l=1; $l<=$count_pages_for_search; $l++){ $file = fopen ($pa[$l],"r"); // открываем страницу для чтения $text=fread($file,filesize($pa[$l])); // записываем содержимое в переменную $text="<span>".$text."</span>"; // это чтобы в начале были всегда теги $m=explode('<',$text); // разбиваем содержимое страницы // еще раз разбиваем чтобы получился двумерный массив // здесь пока все в куче и слова и теги for ($i=0; isset($m[$i]); $i++){ } $count=0; \\ счет для запоминания что содержится в переменной слова или тег $countT=0; \\ счет для массива тегов $countW=0; \\ счет для массива слов for ($i=0; isset($m2[$i]); $i++){ for ($j=0; isset($m2[$i][$j]); $j++){ // т.к. в начале всегда теги первое значение массива - тег if ($j==0){$tag[$countT]=$m2[$i][$j];$countT++; $what[$count]="t";} // второе значение по любому - слова if ($j==1){$words[$countW]=$m2[$i][$j];$countW++; $what[$count]="w";} // а это если вдруг в тексте есть знак больше добавляем к предыдущим словам if ($j>1){$words[$countW-1]=$words[$countW-1]."##".$m2[$i][$j];$count--;} $count++; } } // массив what хранит по сути последовательность из тегов и слов чтобы сложить // содержимое в исходном виде // поиск среди массива слов(текста) нужного слова // реализовано не очень красиво согласен // выделяем слово поиска красным фоном и шрифт желтым цветом и жирным for ($i=0; isset($words[$i]); $i++){ $words[$i]=preg_replace('/'.$word.'/i','<span style="background-color:#ff1c1c;color:#ffefcf;font-weight:bold;">'.$word.'</span>',$words[$i]); } // собераем теги и текст к исходной структуре благодаря массиву what $countT=0; $countW=0; $html=""; for ($i=0; isset($what[$i]); $i++){ if ($what[$i]=="t") {$html=$html."<".$tag[$countT].">";$countT++;} if ($what[$i]=="w") {$html=$html.$words[$countW]; $countW++;} } // убираем косяки, они получаются в самом начале содержимого // восстанавливаем знаки больше если вдруг были в тексте // считаем количество найденных слов на одной странице (очень тупой способ) $q=explode('<span style="background-color:#ff1c1c;color:#ffefcf;font-weight:bold;">',$html); $count=0; for ($i=1; isset($q[$i]); $i++){ $count++; // счетчик количества найденных слов } // здесь формируем элемент div с содержимым страницы если на ней найдено слово // поиска, первый элемент видим, остальные нет $h=""; if ($count>0){$count_pages++; $h="<div id='search".$count_pages."' style='width:100%;"; if ($count_pages>1){$h.="display:none;";} $h.="'>"; $h.="<b><span style='color:#e33030'>".$caption."</span></b> <b><br><span style='color:#a4a4a4'>Найдено совпадений на странице:</span></b> ".$count."<br>"; $h.=$html; $h.="</div>"; $pagetext[$count_pages]=$h; $captions[$count_pages]=$ca[$l]; } } // завершение цикла поиска в очередном файле // формируем список найденных страниц // на список повешена функция JS скрывающая текущую страницу и показывающая выбранную из списка echo "<b><span style='color:#e33030'>Найдено страниц:</span></b> ".$count_pages; echo "<select id='searchedPages' onchange='thisSearchPage()' style='margin-left:50px; width:150px;'>"; for($m=1; isset($pagetext[$m]); $m++){ echo "<option value='".$m."'>".$captions[$m]."</option>"; } echo "</select><br><br>"; // сами страницы первая видима остальные нет for($m=1; isset($pagetext[$m]); $m++){ echo $pagetext[$m]; }
CODE ( javascript):
скопировать код в буфер обмена
CurrentSearchPage=1 function thisSearchPage(){ var a=document.getElementById('searchedPages').selectedIndex a=document.getElementById('searchedPages').options[a].value document.getElementById('search'+CurrentSearchPage).style.display="none" document.getElementById('search'+a).style.display="block" CurrentSearchPage=a; }
(Отредактировано автором: 27 Июня, 2010 - 23:17:40)
|