做個自己站內搜尋引擎

來源:互聯網
上載者:User
關鍵字 做個自己站內搜尋引擎

ccterran(原作)

作者:iwind

朋友用Dreamweaver做了一個網站,沒有動態內容,只是一些個人收藏的文章,個人介紹等等。現在內容比較多了,想叫我幫他做一個搜尋引擎。說實在的,這是一個不難的問題,於是就隨手做了一個。現在我在其它論壇上也看到有人想做這個,於是就想說說這方面的知識,重在瞭解一下方法。

寫程式前先要想好一個思路,下面是我的思路,可能誰有更好的,但注意這隻是一個方法問題 :遍曆所有檔案  讀取內容  搜尋索引鍵,如果匹配就放入一個數組  讀數組。在實現這些步驟之前,我假定你的網頁都是標準的,就是有標題(),也有(),如果你是用dreamweaver或者frontpage設計的,那麼除非你故意刪掉,它們都在存在的。下面就讓我們一步步來完成並在工程中改善這個搜尋引擎。

一,設計搜尋表單
在網站的根目錄下建個search.htm,內容如下


搜尋表單





二,搜尋程式
再在根目錄下建個search.php 的檔案,用來處理search.htm表單傳過來的資料.內容如下
//擷取搜尋索引鍵
$keyword=trim($_POST[“keyword”]);
//檢查是否為空白
if($keyword==””){
  echo”您要搜尋的關鍵字不可為空”;
  exit;//結束程式
}
?>

這樣如果訪問者輸入的關鍵字為空白時,可以做出提示。下面是遍曆所有檔案。

我們可以用遞迴的方法遍曆所有的檔案,可以用函數opendir,readdir,也可以用PHP Directory的類。我們現在用前者.
//遍曆所有檔案的函數
function listFiles($dir){
  $handle=opendir($dir);
  while(false!==($file=readdir($handle))){
     if($file!="."&&$file!=".."){
     //如果是目錄就繼續搜尋
     if(is_dir("$dir/$file")){
       listFiles("$dir/$file");
     }
       else{
      //在這裡進行處理
       }
   }
  }
}

?>

在紅字的地方我們可以對搜尋到的檔案進行讀取,處理.下面就是讀取檔案內容,並檢查內容中是否含有關鍵字$keyword,如果含有就把檔案地址賦給一個數組。
//$dir是搜尋的目錄,$keyword是搜尋的關鍵字 ,$array是存放的數組
function listFiles($dir,$keyword,&$array){
  $handle=opendir($dir);
  while(false!==($file=readdir($handle))){
     if($file!="."&&$file!=".."){
     if(is_dir("$dir/$file")){
       listFiles("$dir/$file",$keyword,$array);
     }
       else{
      //讀取檔案內容
      $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
      //不搜尋自身
      if($file!=”search.php”){
       //是否匹配
             if(eregi("$keyword",$data)){
         $array[]="$dir/$file";
             }
      }
       }
   }
  }
}
//定義數組$array
$array=array();
//執行函數
listFiles(".","php",$array);
//列印搜尋結果
foreach($array as $value){
  echo "$value"."
\n";
}
?>

現在把這個結果和開頭的一段程式結合起來,輸入一個關鍵字,然後就會發現你的網站中的相關結果都被搜尋出來了。我們現在在把它完善一下。
1,列出內容的標題

             if(eregi("$keyword",$data)){
         $array[]="$dir/$file";
             }
改成
             if(eregi("$keyword",$data)){
                  if(eregi("(.+)",$data,$m)){
            $title=$m["1"];
                  }
                  else{
            $title="沒有標題";
                  }
                  $array[]="$dir/$file $title";
              }
原理就是,如果在檔案內容中找到xxx,那麼就把xxx取出來作為標題,如果找不到那麼就把標題命名未”沒有標題”.

2,只搜尋網頁的內容的主題部分。
做網頁時一定會有很多html代碼在裡面,而這些都不是我們想要搜尋的,所以要去除它們。我現在用Regex和strip_tags的配合,並不能把所有的都去掉。

      $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
      //不搜尋自身
      if($file!=”search.php”){
       //是否匹配
             if(eregi("$keyword",$data)){
改為
$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
      if(eregi("]+)>(.+)",$data,$b)){
         $body=strip_tags($b["2"]);
            }
            else{
         $body=strip_tags($data);
            }
            if($file!="search.php"){
              if(eregi("$keyword",$body)){

3,標題上加連結
foreach($array as $value){
  echo "$value"."
\n";
}
改成
foreach($array as $value){
  //拆開
  list($filedir,$title)=split(“[ ]”,$value,”2”);
  //輸出
  echo "$value"."
\n";
}
4防止逾時
如果檔案比較多,那麼防止PHP執行時間逾時是必要的。可以在檔案頭加上
set_time_limit(“600”);
以秒為單位,所以上面是設10分鐘為限。


所以完整的程式就是
set_time_limit("600");
//擷取搜尋索引鍵
$keyword=trim($_POST["keyword"]);
//檢查是否為空白
if($keyword==""){
  echo"您要搜尋的關鍵字不可為空";
  exit;//結束程式
}
function listFiles($dir,$keyword,&$array){
  $handle=opendir($dir);
  while(false!==($file=readdir($handle))){
     if($file!="."&&$file!=".."){
     if(is_dir("$dir/$file")){
       listFiles("$dir/$file",$keyword,$array);
     }
       else{
      $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
            if(eregi("]+)>(.+)",$data,$b)){
         $body=strip_tags($b["2"]);
            }
            else{
         $body=strip_tags($data);
            }
            if($file!="search.php"){
              if(eregi("$keyword",$body)){
                  if(eregi("(.+)",$data,$m)){
            $title=$m["1"];
                  }
                  else{
            $title="沒有標題";
                  }
                  $array[]="$dir/$file $title";
              }
            }
       }
   }
  }
}
$array=array();
listFiles(".","$keyword",$array);
foreach($array as $value){
  //拆開
  list($filedir,$title)=split("[ ]",$value,"2");
  //輸出
  echo "$title "."
\n";
}
?>

到此為止,你已經做好了自己的一個搜尋引擎,你也可以通過修改內容處理部分來改進它,可以實現搜尋標題,或者搜尋內容的功能。也可以考慮分頁。這些都留給你自己吧。

這裡說明一下用PReg_match代替eregi,會快很多。這裡只是為了通俗易懂,所以使用了常用的eregi.

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.