Algorytmy

Własna wyszukiwarka

Własna wyszukiwarka to fajna rzecz! Każdy kto wejdzie na Twoją stronę i będzie chciał coś znaleźć wpisze odpowiednie słowo kluczowe w odpowiednim okienku :) Jak to zrobić? Zaraz zobaczysz. Jak to działa? Ja zrobiłem tak:

1. Skrypt otwiera główny katalog serwera i wczytuje nazwy wszystkich plików oraz katalogów.
2. Pętla for przelatuje po wszystkich elementach tablicy - dirs - to tutaj będą wpisane nazwy wszystkich katalogów na serwerze. Na samym początku działania pętli w tablicy znajduje się tylko jeden element - katalog główny naszego serwisu. Pierwsza instrukcja if sprawdza czy dany element jest plikiem czy katalogiem.
3. Jeżeli pętla znalazła katalog to dodajmy go do tablicy dirs i co niezbędne - zapobiegamy dalszemu wykonywaniu skryptu poprzez komendę continue (wymuszamy jej "przeładowanie").
4. Jeżeli znaleziona pozycja nie jest katalogiem odczytujemy ją, a konkretnie wczytujemy do zmiennej cały plik...  

Teraz trochę kodu.

$startdir = "/home/users/programming/";
$dirs[0] = "$startdir";
$ext = "html|shtml";
$counter = 1;


tablica dirs to będzie tablica w której przechowywać będziemy wszystkie znalezione katalogi. Na początek ładujemy tam jeden element - katalog główny serwisu. Zmienna $ext to akceptowane przez skrypt rozszerzenia - wpisz je po znaku |. Zmienna $counter będzie oznaczała ilość znalezionych elementów. Teraz najważniejsza pętla która zrealizuje poszukiwania:

for ($i=0; $i<count($dirs); $i++) {
    chdir($dirs[$i]);

    $handle = opendir($dirs[$i]);
    while ($file = readdir($handle)) {
      list($fname, $fext) = split("\\.", $file);
      
     if (($file <> '.') and ($file <> '..') and (is_dir($file)) 
           and (preg_match("/$fext/", $ext))) {
        array_push ($dirs, "$dirs[$i]$file/");
        continue;
      }

      if (ereg($ext, $fext)) {
        $plik = file($file);

        $plik = join("", $plik);

        preg_match("/<meta name=\\"keywords\\" content=\\"(.*)\\">/i", 
$plik, $keyword);
        preg_match("/<meta name=\\"description\\" content=\\"(.*)\\">/i", 
$plik, $description);
        
        
        if ((preg_match($ss, $keyword[1])) || (preg_match($ss, $description[1]))) {
        
          $keywords[$counter] = $keyword[1];
          if ($description[1]) {
            $des[$counter] = $description[1];
          } else {
            $des[$counter] = $keyword[1];
          }
          $url[$counter] = "$dirs[$i]$file";
          ereg("$startdir(.*)", $url[$counter], $out);
          $url[$counter] = "http://$SERVER_NAME/$out[1]";
          
          if (ereg("<title>(.*)</title>", $plik, $out)) {
            $title[$counter] = $out[1];
          } else {
            $title[$counter] = "No Title";
          }
          $des[$counter] = preg_replace($ss, "<span style=\\"background-color: 
  1. C0C0C0\\">$Q</span>", $des[$counter]);
          $title[$counter] = preg_replace($ss, "<span style=\\"background-color:
  1. C0C0C0\\">$Q</span>", $title[$counter]);
          ++$counter;
        }
      }
    }
  }


Przeanalizujemy teraz ten kod po kolei.

for ($i=0; $i<count($dirs); $i++) {
    chdir($dirs[$i]);

    $handle = opendir($dirs[$i]);
    while ($file = readdir($handle)) {
      list($fname, $fext) = split("\\.", $file);
      
     if (($file <> '.') and ($file <> '..') and (is_dir($file)) and 
           (preg_match("/$fext/", $ext))) {
        array_push ($dirs, "$dirs[$i]$file/");
        continue;
      }


Ten kod powoduje otwarcie katalogu z elementu tablicy dirs, a następnie przy pomocy funkcji readdir odczytanie w pętli wszystkich jej elementów. Później następuje rozbicie nazwy pliku na nazwę oraz rozszerzenie. Następnie w instrukcji if następuje sprawdzenie, czy znalezione pozycje nie są oznaczeniami katalogu wyżej. Jeżeli znaleziona pozycja jest katalogiem (funkcja is_dir ) - do tablicy dodaj ścieżkę do tego katalogu i wywołaj polecenie continue; W ten sposób osiągam efekt rekurencji.

Oto kolejny blok instrukcji:

if (ereg($ext, $fext)) {
        $plik = file($file);

        $plik = join("", $plik);

        preg_match("/<meta name=\\"keywords\\" content=\\"(.*)\\">/i", 
$plik, $keyword);
        preg_match("/<meta name=\\"description\\" content=\\"(.*)\\">/i", 
$plik, $description);
        
        
        if ((preg_match($ss, $keyword[1])) || (preg_match($ss, $description[1]))) {
        
          $keywords[$counter] = $keyword[1];
          if ($description[1]) {
            $des[$counter] = $description[1];
          } else {
            $des[$counter] = $keyword[1];
          }
          $url[$counter] = "$dirs[$i]$file";
          ereg("$startdir(.*)", $url[$counter], $out);
          $url[$counter] = "http://$SERVER_NAME/$out[1]";
          
          if (ereg("<title>(.*)</title>", $plik, $out)) {
            $title[$counter] = $out[1];
          } else {
            $title[$counter] = "No Title";
          }
          $des[$counter] = preg_replace($ss, "<span style=\\"background-color: 
  1. C0C0C0\\">$Q</span>", $des[$counter]);
          $title[$counter] = preg_replace($ss, "<span style=\\"background-color:
  1. C0C0C0\\">$Q</span>", $title[$counter]);
          ++$counter;
        }
      }
    }
  }


Tutaj na samym początku następuje sprawdzenie, czy rozszerzenie danego pliku znajduje się w zmiennej $ext. Później do tablicy zostanie wczytany plik - teraz każda linia pliku to jeden element tablicy. Później tablica zostaje łączona - zostaje zapisana jako jedna linia przy pomocy polecenia join. Dzięki poleceniu preg_match wyszukujemy w pliku słowa kluczowe wpisane w sekcji keywords oraz opis pliku z sekcji description. Następnie następuje sprawdzenie, czy szukane słowo (zmienna $ss) znajduje się w sekcji desciption lub w sekcji keywords. Następnie to tablic $keywords, $des, $url, $title zostają przypisane dane z edytowanego pliku. Tak więc mamy tablice zawierające dane plików, które muszą zostać wyświetlone gdyż to jest właśnie rezultat naszego wyszukiwania. Teraz od Ciebie tylko zależy jak chcesz wyświetlić wyniki wyszukiwań.  

To by było na tyle jeśli chodzi o wyszukiwanie w PHP. Oczywiście to był tylko przykład - Ty możesz tutaj wiele zmienić...

2 komentarze

miner 2006-05-03 22:44

a co z dolaczanymi plikami... nie da sie wymusic przetworzenia ich przez php przed wczytaniem?

thane 2005-07-12 17:48

Niestety, to tylko wyglada tak \'latwo\'. A co z parametrami (nazwa_pliku.php?strona=blablabla)?