Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Przeszukiwanie plików na serwerze w poszukiwaniu frazy.
Forum PHP.pl > Forum > Przedszkole
wlodziu
Witam. Próbuje stworzyć wyszukiwarkę plików na serwerze. Jej działanie ma polegać na tym, że wpisuje szukaną fraze i skrypt przeszukuje wszystkie katalogi i pliki na serwerze w poszukiwaniu tej frazy i wyświetla liste plików w jakich ona się znajduje. Mam taki skrypt on działa, ale (jest jedno ale) nie szuka w plikach php, znaczy szuka, ale nie wiem na jakiej zasadzie jeśli umieszczę np w pliku:
  1. <?php
  2. echo "ala ma kota";
  3. ?>

To nie znajdzie żadnych ze słów.
A chodzi mi o to by szukało np. zmiennej. Proszę o pomoc, niżej kod PHP skryptu:
  1.  
  2. <?
  3.  
  4. if (isset($_POST["zapytanie"])) $zapytanie=strtolower($_POST["zapytanie"]);
  5. else $zapytanie="";
  6.  
  7. $zakazane_pliki=array("funkcje.php","hasla.php","szukaj.php");
  8. $dozwolone_rozszerzenia=array("htm","html","php");
  9.  
  10. if ($zapytanie!="") {
  11. echo "Wyniki wyszukiwania frazy <b>$zapytanie</b>:<br>";
  12. przeszukuj(".",$zapytanie, $zakazane_pliki,$dozwolone_rozszerzenia);
  13. }
  14. else echo "Nie wpisales zadnej frazy!";
  15.  
  16.  
  17. function przeszukuj($nazwa_folderu,$zapytanie,$zakazane_pliki,$dozwolone_rozszerzenia)
  18. {
  19.  
  20. if (!isset($nazwa_folderu)) $nazwa_folderu=".";
  21.  
  22. $folder=opendir($nazwa_folderu);
  23.  
  24. while ($plik=readdir($folder))
  25. {
  26. if ((!in_array($plik, $zakazane_pliki)) && in_array(substr($plik,strrpos($plik,".")+1),$dozwolone_rozszerzenia))
  27. {
  28. $zawartosc=implode("",file($nazwa_folderu."/".$plik));
  29. $zawartosc2=strip_tags(strtolower($zawartosc));
  30. $pozycja=strpos($zawartosc2, $zapytanie);
  31. $start=strpos($zawartosc, "<title>")+7;
  32. $stop=strpos($zawartosc, "</title>");
  33.  
  34. if ($start===false || $stop===false)
  35. $tytul="".$nazwa_folderu."/".$plik."";
  36. else
  37. $tytul="".$nazwa_folderu."/".$plik."";
  38.  
  39.  
  40. if ($pozycja!==false)
  41. {
  42. echo "<a href=".$nazwa_folderu."/".$plik.">".$nazwa_folderu."/".$plik."</a><br>";
  43. }
  44. }
  45.  
  46. if ($plik!="." && $plik!=".." && is_dir($nazwa_folderu."/".$plik))
  47. przeszukuj($nazwa_folderu."/".$plik, $zapytanie, $zakazane_pliki, $dozwolone_rozszerzenia);
  48. }
  49.  
  50. closedir($folder);
  51. }
  52.  
  53. ?>

Z góry dziękuję.
Adi32
  1. <?php
  2.  
  3.  
  4. function szukaj($sama='',$cos,&$gdzie)
  5. {
  6. global $return;
  7.  
  8. //global $_POST['gdzie'];
  9.  
  10. if (!empty($gdzie)) {
  11. $tyl = '../../'.$gdzie.'/';
  12. } else {
  13. $tyl = '../../';
  14. }
  15. //$tyl = '../'; // folder nadrzedny
  16. //$tyl = '../../strony/'; - strony
  17.  
  18. // ustawiania licznika
  19. if ($i='') {
  20. $i=0;
  21. }
  22. global $i;
  23.  
  24. $sciezkaa .= $sama.'/';
  25.  
  26. $sciezka = $tyl.$sciezkaa;
  27.  
  28. $sciezka = str_replace('//','/',$sciezka);
  29.  
  30. if ($handle = opendir($sciezka)) {
  31.  
  32. while (false !== ($file = readdir($handle)))
  33. {
  34.  
  35. if($file!=='..' && $file!=='.' && $file!=='jpg' && $file!=='png') {
  36.  
  37. if (is_dir($sciezka.$file)) {
  38.  
  39. szukaj($sciezkaa.$file, $cos,$gdzie);
  40.  
  41. } else {
  42.  
  43. if (strpos(file_get_contents($sciezka.$file), $cos) !== false) {
  44. echo $cos .' Znaleziono w pliku: '.$sciezka.$file.'<br />';
  45. flush();
  46.  
  47. }
  48.  
  49. }
  50.  
  51. }
  52.  
  53. }
  54.  
  55. closedir($handle);
  56. }
  57.  
  58. return $return;
  59.  
  60. }
  61.  
  62.  
  63.  
  64.  
  65. ?>
  66.  
  67. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  68. <html xmlns="http://www.w3.org/1999/xhtml" lang="pl" xml:lang="pl">
  69. <head>
  70. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  71. <title>Znajdywarka</title>
  72. <meta name="language" content="pl" />
  73. <meta name="Description" content="opis strony" />
  74. <meta name="Keywords" content=" wyraz1, wyraz2, wyraz3, wyraz4..." />
  75. <link rel="stylesheet" type="text/css" href="css/screen.css" />
  76. <script type="text/javascript" src="js/jquery.js"></script>
  77. <script type="text/javascript" src="js/js.js"></script>
  78. </head>
  79.  
  80. <body>
  81.  
  82. <p>Jeżeli wpiszesz coś w pole 'gdzie' to wyszukiwanie odbędzie się w: strony/(gdzie)/</p>
  83. <p>Jeżeli nic nie wpiszesz w pole 'gdzie' to wyszukiwanie odbędzie się w: strony/</p>
  84. <p></p>
  85. <form method="POST" action="detal.php">
  86. <label>Gdzie: <input type="text" name="gdzie" value=<?=$_POST['gdzie']?> /></label>
  87. <label>Co: <input type="text" name="cos" value=<?=$_POST['cos']?> /></label>
  88. <label><input type="submit" name="szukaj" value="Szukaj!"></label> <br />
  89.  
  90. </form>
  91.  
  92. <?php
  93.  
  94. if(isset($_POST['szukaj']) && !empty($_POST['cos'])) {
  95.  
  96. echo '<pre>';
  97. print_r(szukaj(null,$_POST['cos'],$_POST['gdzie']));
  98. echo '</pre>';
  99.  
  100. }
  101.  
  102. ?>
  103.  
  104. </body>
  105. </html>


Napisałem sobie jeszcze wersje FTP, która przeszuka cały server do którego się zalogujesz ale niestety nie udostępnię.

Ta wersja potrafi cofnąć się do folderu public_html lub niżej jeżeli brak praw.

Sądzę ze będziesz potrafił przystosować do swoich potrzeb.
redeemer
Myślę, że błąd leży tutaj:
  1. $zawartosc2=strip_tags(strtolower($zawartosc));
wlodziu
Adi32, nie działa poprawnie.. http://wlodziu.eu/szuka3.php , właśnie chodzi mi żeby logował sie na serwer i szukał ;]

redeemer, on tylko tu zamienia znaki, moim zdaniem nie parsuje kodu php.
by_ikar
Nie wiem czy dobrze zrozumiałem. Ma przeszukiwać katalogi w poszukiwaniu plików o konkretnej frazie tak? Bo na początku zrozumiałem, że ma je otwierać i szukać frazy, ale po kodzie nie widzę tego aby miał go otwierać.. Bardzo dobrze byłoby tutaj zastosować, o ile chodzi o samo wyszukiwanie plików według nazwy, po podanej frazie; bardzo dobre użycie wówczas RecursiveDirectoryIterator jak i RecursiveIteratorIterator.

Napisałem na swoje potrzeby loader klas w php. Przeszukuje on katalogi które mu podam, oraz podkatalogi wcześniej podanych katalogów. I w sumie bardzo ładnie to działa, bo tworzy sobie mapę plików w postaci tablicy gdzie kluczem jest nazwa klasy a wartością ścieżka do pliku. Jeżeli np raz byś przeszukał sobie wszystkie pliki stworzył taką mapę plików, i aktualizował ją co jakiś czas (może być cron, może być cache które ma jakiś czas żywotności) i całość może nawet dość szybko chodzić. Jeżeli chodzi o przeszukiwanie takiej mapy, frazami które są nie pełne, to jest: masz przykładowo plik o nazwie "ala ma kota.txt" a ktoś w polu wyszukiwarki wpisał: "ala ma" to w sumie mogło by to trochę mniej optymalnie wyglądać, ale chyba bardziej optymalnie niż za każdym razem przeszukiwać dziesiątki katalogów w poszukiwaniu danej frazy.

Jeżeli przeszukiwanie katalogów za każdym razem, to nie problem, to zawsze można użyć glob który uprości sporo kodu.
wlodziu
źle zrozumialeś, chodzi o to by każdy plik w każdym katalogu otwierał i szukał podanej frazy
Adi32
Cytat(wlodziu @ 4.07.2011, 10:12:19 ) *
Adi32, nie działa poprawnie.. http://wlodziu.eu/szuka3.php , właśnie chodzi mi żeby logował sie na serwer i szukał ;]

redeemer, on tylko tu zamienia znaki, moim zdaniem nie parsuje kodu php.


Tak, ponieważ nie edytowałeś ścieżki.

  1. $tyl


ustaw sobie na '../' albo wpisz tak jak Ci będzie pasowało na serverze.

P.S. Teraz ja nie wiem czy dobrze rozumiem ale ten skrypt otwiera pliki i przeszukuje ich zawartość w poszukiwaniu frazy.

Jeżeli chcesz skrypt który sprawdza tylko nazwy to też mam, mogę udostępnic.

Jeżeli chodzi Ci o szukacz FTP to ciężka sprawa, to mój autorski skrypt który powstał głównie w celach przenoszenia plików z serwera1 do servera2 z możliwością ich edycji w locie na podstawie kluczy. Musiałbym wyciąć z niego tylko część szukającą...
wlodziu
Dokłądnei chodzi o to, podaje dane do ftp (formularz) skrypt sie loguje startuje z public_html i przeszukuje wszystkie katalogi i pliki w poszukiwaniu wpisanej frazy, ale musi też szukać zmiennych.
Adi32
  1. <?
  2.  
  3. $ftp_server = "";
  4. $ftp_user = "";
  5. $ftp_pass = "";
  6.  
  7.  
  8.  
  9. $conn = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server");
  10.  
  11. // try to login
  12. if (@ftp_login($conn, $ftp_user, $ftp_pass)) {
  13. //echo "Connected as $ftp_user@$ftp_server\n";
  14. echo 'nawiazano polaczenie z serverem!';
  15. $nav = 'ok';
  16. } else {
  17. echo "Couldn't connect as $ftp_user\n";
  18. }
  19.  
  20. function szukaj(&$conn,$sciezka='domains',$szukane)
  21. {
  22. echo '<pre>';
  23.  
  24. $lista = (ftp_nlist($conn,$sciezka));
  25.  
  26.  
  27. if (is_array($lista)) {
  28.  
  29. foreach ($lista as $num => $plik)
  30. {
  31.  
  32. //sleep(0.1);
  33.  
  34. $info = (pathinfo($plik));
  35.  
  36. if ($info['extension'] != '.' && $info['extension'] != '..' /* && $info['filename'] != 'jquery-tooltip' && $info['filename'] != 'przystan' && $info['filename'] != 'examples' && $info['filename'] != 'makefont' && $info['filename'] != 'font' && $info['filename'] != 'fpdf'*/) {
  37.  
  38. //echo '<br /> Info o pliku '.$plik.'<br />';
  39. //print_r ($info);
  40.  
  41. // jeśli katalog
  42. if(!isset($info['extension']) && $info['filename'] != '..' && $info['filename'] != '.') {
  43. echo '<br />Otwieram: '. $info['dirname'].'/'.$info['basename'].'<br />';
  44. szukaj($conn,$info['dirname'].'/'.$info['basename'],$szukane);
  45. }
  46. echo $plik.'<br />';
  47. flush();
  48. //echo $plik.'<br />';
  49. /*flush();
  50.  
  51.   if($info['basename'] == $szukane) {
  52.   echo $plik.'<br />';
  53.   flush();
  54.   }
  55.   */
  56. }
  57.  
  58. }
  59.  
  60. }
  61.  
  62. }
  63.  
  64. ?>
  65.  
  66. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  67. <html xmlns="http://www.w3.org/1999/xhtml" lang="pl" xml:lang="pl">
  68. <head>
  69. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  70. <title>Znajdywarka</title>
  71. <meta name="language" content="pl" />
  72. <meta name="Description" content="opis strony" />
  73. <meta name="Keywords" content=" wyraz1, wyraz2, wyraz3, wyraz4..." />
  74. <link rel="stylesheet" type="text/css" href="css/screen.css" />
  75. </head>
  76.  
  77. <body>
  78.  
  79. <p>Jeżeli wpiszesz coś w pole 'gdzie' to wyszukiwanie odbędzie się w: domena.pl/strony/(gdzie)/</p>
  80. <p>Jeżeli nic nie wpiszesz w pole 'gdzie' to wyszukiwanie odbędzie się w: domena.pl/strony/</p>
  81. <p></p>
  82.  
  83. <form method="POST" action="">
  84. <label>Gdzie: <input type="text" name="gdzie" value=<?=$_POST['gdzie']?> /></label>
  85. <label>Co: <input type="text" name="cos" value=<?=$_POST['cos']?> /></label>
  86. <label><input type="submit" name="szukaj" value="Szukaj!"></label> <br />
  87.  
  88. </form>
  89.  
  90. <?php
  91.  
  92. if(isset($_POST['szukaj']) && !empty($_POST['cos'])) {
  93.  
  94. echo '<pre>';
  95. szukaj($conn,'sciezka/startowa',$_POST['cos']);
  96. echo '</pre>';
  97.  
  98. }
  99.  
  100. ?>
  101.  
  102. </body>
  103.  
  104. </html>


szuka po nazwach plików, wystarczy zedytować aby przeszukiwał pliki.
wlodziu
Dzięki, tylko nie wiem jak zrobić by przeszukiwał też pliki php, np w szukana fraze wpisze $login i znajdzie mi wszystkei pliki które posiadają tą zmienną
Adi32
Ok spróbuje dopisać Ci wyszukiwanie w plikach.

Spróbuj przystosować na razie szukacz po nazwach do swoich potrzeb.
redeemer
Cytat(wlodziu @ 4.07.2011, 10:12:19 ) *
redeemer, on tylko tu zamienia znaki, moim zdaniem nie parsuje kodu php.

Proponuję zobaczyć jak wyglada zawartość zmiennej $zawartosc2:
  1. $zawartosc2 = echo strip_tags(strtolower("<?php echo 'ala ma kota';?> ala ma psa"));
Funkcja strip_tags() usuwa wszystko pomiędzy < i >
wlodziu
Problem rozwiązany, dziekuje wszystkim za pomoc.
Adi32
Ten mój skrypt na zasadzie FTP łączy się z zewnętrznym serverem, jednak otwieranie plików i edycja w locie przy wysyłaniu odbywa się za pomocą PHP. Tak więc popatrz sobie w manualu funkcje FTP i zobacz czy któraś oferuje pobieranie zawartości pliku. Jeśli nie to zrób sobie folder TEMP i i dopisz skrytpa który będzie do niego tymczasowo kopiować pliki do przeszukania, potem kasować. Prosta sprawa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.