Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: нестандартный php поиск по страницам
Форумы портала PHP.SU » PHP » Пользовательские функции » нестандартный php поиск по страницам

Страниц (1): [1]
 

1. bushstas - 27 Июня, 2010 - 23:01:52 - перейти к сообщению
Знаю что существует множество готовых php скриптов поиска, но я решил написать что-то свое, может быть я не изобрел велосипед, но такого я просто нигде не видел, как мне кажется он достаточно удобен для пользователя.

его работу можно посмотреть на сайте http://www[dot]mpk-ekb[dot]ru набрав в строке поиска КОМП (например)

PHP:
скопировать код в буфер обмена
  1.  
  2. $pa=Array(); // массив из путей к файлам (страницам)
  3. $ca=Array(); // массив названий страниц для формирования списка
  4.  
  5. $pa[1]="page1.php";
  6. $ca[1]="Страница 1";
  7. $pa[2]="page2.php";
  8. $ca[2]="Страница 2";
  9. $pa[3]="page3.php";
  10. $ca[3]="Страница 3";
  11.  
  12. $count_pages_for_search=3; // кол-во страниц для поиска
  13.  
  14. setlocale(LC_ALL, 'ru_RU.CP1251'); // чтобы strtoupper работал для кириллицы
  15.  
  16. $word=$_POST['word']; // переданное из формы слово для поиска
  17. $word=strtoupper($word); // слово для поиска в верхний регистр
  18.  
  19.  
  20. $captions=Array();      // массив названий страниц где слово найдено
  21.  
  22. $count_pages=0; // счет страниц где слово найдено
  23.  
  24. // цикл поиска
  25. for($l=1; $l<=$count_pages_for_search; $l++){
  26.  
  27. $file = fopen ($pa[$l],"r"); // открываем страницу для чтения
  28. $text=fread($file,filesize($pa[$l])); // записываем содержимое в переменную
  29.  
  30. $text="<span>".$text."</span>"; // это чтобы в начале были всегда теги
  31. $m=explode('<',$text);  // разбиваем содержимое страницы
  32.  
  33. // еще раз разбиваем чтобы получился двумерный массив
  34. // здесь пока все в куче и слова и теги
  35. for ($i=0; isset($m[$i]); $i++){
  36. $m2[$i]=explode('>',$m[$i]);                                   
  37. }
  38.  
  39. $count=0; \\ счет для запоминания что содержится в переменной слова или тег
  40. $countT=0; \\ счет для массива тегов
  41. $countW=0; \\ счет для массива слов
  42.  
  43. for ($i=0; isset($m2[$i]); $i++){
  44.                                        
  45. for ($j=0; isset($m2[$i][$j]); $j++){
  46.  
  47. // т.к. в начале всегда теги первое значение массива - тег                     
  48. if ($j==0){$tag[$countT]=$m2[$i][$j];$countT++; $what[$count]="t";}
  49. // второе значение по любому - слова
  50. if ($j==1){$words[$countW]=$m2[$i][$j];$countW++;  $what[$count]="w";}
  51. // а это если вдруг в тексте есть знак больше добавляем к предыдущим словам
  52. if ($j>1){$words[$countW-1]=$words[$countW-1]."##".$m2[$i][$j];$count--;}
  53. $count++;
  54. }
  55. }
  56. // массив what хранит по сути последовательность из тегов и слов чтобы сложить
  57. // содержимое в исходном виде
  58.  
  59.  
  60.  
  61. // поиск среди массива слов(текста) нужного слова
  62. // реализовано не очень красиво согласен
  63. // выделяем слово поиска красным фоном и шрифт желтым цветом и жирным
  64. for ($i=0; isset($words[$i]); $i++){
  65. $words[$i]=preg_replace('/'.$word.'/i','<span style="background-color:#ff1c1c;color:#ffefcf;font-weight:bold;">'.$word.'</span>',$words[$i]);
  66. }
  67.  
  68.  
  69. // собераем теги и текст к исходной структуре благодаря массиву what
  70. $countT=0;
  71. $countW=0;
  72. $html="";
  73. for ($i=0; isset($what[$i]); $i++){
  74. if ($what[$i]=="t") {$html=$html."<".$tag[$countT].">";$countT++;}
  75. if ($what[$i]=="w") {$html=$html.$words[$countW]; $countW++;}
  76. }
  77.  
  78. // убираем косяки, они получаются в самом начале содержимого
  79. $html=str_replace("<>","",$html);
  80. $html=str_replace("< >","",$html);
  81. // восстанавливаем знаки больше если вдруг были в тексте
  82. $html=str_replace("##",">",$html);
  83.  
  84.  
  85. // считаем количество найденных слов на одной странице (очень тупой способ)
  86. $q=explode('<span style="background-color:#ff1c1c;color:#ffefcf;font-weight:bold;">',$html);
  87. $count=0;
  88. for ($i=1; isset($q[$i]); $i++){
  89. $count++; // счетчик количества найденных слов
  90. }
  91.  
  92. // здесь формируем элемент div с содержимым страницы если на ней найдено слово
  93. // поиска, первый элемент видим, остальные нет
  94. $h="";
  95. if ($count>0){$count_pages++;
  96. $h="<div id='search".$count_pages."' style='width:100%;";
  97. if ($count_pages>1){$h.="display:none;";}
  98. $h.="'>";
  99. $caption=strtoupper($ca[$l]);
  100. $h.="<b><span style='color:#e33030'>".$caption."</span></b>&nbsp;&nbsp;&nbsp;<b><br><span style='color:#a4a4a4'>Найдено совпадений на странице:</span></b> ".$count."<br>";                            
  101. $h.=$html;
  102. $h.="</div>";
  103. $pagetext[$count_pages]=$h;
  104. $captions[$count_pages]=$ca[$l];
  105. }
  106.  
  107. fclose ($file);
  108.                                        
  109. } // завершение цикла поиска в очередном файле
  110.  
  111. // формируем список найденных страниц
  112. // на список повешена функция JS скрывающая текущую страницу и показывающая выбранную из списка
  113. echo "<b><span style='color:#e33030'>Найдено страниц:</span></b> ".$count_pages;       
  114. echo "<select id='searchedPages' onchange='thisSearchPage()' style='margin-left:50px; width:150px;'>";
  115. for($m=1; isset($pagetext[$m]); $m++){
  116. echo "<option value='".$m."'>".$captions[$m]."</option>";
  117. }
  118. echo "</select><br><br>";
  119.  
  120. // сами страницы первая видима остальные нет
  121. for($m=1; isset($pagetext[$m]); $m++){
  122. echo $pagetext[$m];
  123. }
  124.  


CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. CurrentSearchPage=1
  3.  
  4. function thisSearchPage(){
  5. var a=document.getElementById('searchedPages').selectedIndex
  6. a=document.getElementById('searchedPages').options[a].value
  7. document.getElementById('search'+CurrentSearchPage).style.display="none"
  8. document.getElementById('search'+a).style.display="block"
  9. CurrentSearchPage=a;
  10. }
  11.  

 

Powered by ExBB FM 1.0 RC1