注册 | 登录 | 搜索 
 ›› ›› 『 动网论坛技术 』›› 做个自己站内搜索引擎
共有 1086 人关注过本帖  
<< 上一主题    下一主题 >>
树形 打印

做个自己站内搜索引擎

帅哥哟,离线,有人找我吗?

头衔:动网爱好者

等级:业余侠客

文章:467

积分:2954

注册:2004-05-29 04:25:00

楼主  2008-06-22 15:06:17  

写程序前先要想好一个思路,下面只是个人的思路,可能谁有更好的,但注意这只是一个方法问题 :遍历所有文件  读取内容  搜索关键字,如果匹配就放入一个数组  读数组。在实现这些步骤之前,我假定你的网页都是标准的,就是有标题(<title></title>),也有(<bod *></body>),如果你是用dreamweaver或者frontpage设计的,那么除非你故意删掉,它们都在存在的。下面就让我们一步步来完成并在工程中改善这个搜索引擎。

一,设计搜索表单
在网站的根目录下建个search.htm,内容如下
<html>
<head>
<title>搜索表单</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<form name="form1" method="post" action="search.php">
  <table width="100%" cellspacing="0" cellpadding="0">
    <tr>
      <td width="36%">
        <div align="center">
          <input type="text" name="keyword">
        </div>
      </td>
      <td width="64%">
        <input type="submit" name="Submit" value="搜索">
      </td>
    </tr>
  </table>
</form>
</body>
</html>


二,搜索程序
再在根目录下建个search.php 的文件,用来处理search.htm表单传过来的数据.内容如下
<?php
//获取搜索关键字
$keyword=trim($_POST[“keyword”]);
//检查是否为空
if($keyword==””){
   echo”您要搜索的关键字不能为空”;
   exit;//结束程序
}
?>

这样如果访问者输入的关键字为空时,可以做出提示。下面是遍历所有文件。

我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.
<?php
  //遍历所有文件的函数
  function listFiles($dir){
   $handle=opendir($dir);
   while(false!==($file=readdir($handle))){
          if($file!="."&&$file!=".."){
          //如果是目录就继续搜索
          if(is_dir("$dir/$file")){
             listFiles("$dir/$file");
          }
              else{
            //在这里进行处理
             }
      }
   }
}

?>

在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋给一个数组。
<?php
//$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"."<br>\n";
}
?>

现在把这个结果和开头的一段程序结合起来,输入一个关键字,然后就会发现你的网站中的相关结果都被搜索出来了。我们现在在把它完善一下。
1,列出内容的标题

                          if(eregi("$keyword",$data)){
                  $array[]="$dir/$file";
                          }
改成
                          if(eregi("$keyword",$data)){
                                   if(eregi("<title>(.+)</title>",$data,$m)){
                        $title=$m["1"];
                                   }
                                   else{
                        $title="没有标题";
                                   }
                                   $array[]="$dir/$file $title";
                           }
原理就是,如果在文件内容中找到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.

2,只搜索网页的内容的主题部分。
做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表达式和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("<body([^>]+)>(.+)</body>",$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"."<br>\n";
}
改成
foreach($array as $value){
   //拆开
   list($filedir,$title)=split(“[ ]”,$value,”2”);
   //输出
   echo "<a href=$filedir>$value</a>"."<br>\n";
}
4防止超时
如果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上
set_time_limit(“600”);
以秒为单位,所以上面是设10分钟为限。


所以完整的程序就是
<?php
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("<body([^>]+)>(.+)</body>",$data,$b)){
                 $body=strip_tags($b["2"]);
                        }
                        else{
                 $body=strip_tags($data);
                        }
                        if($file!="search.php"){
                            if(eregi("$keyword",$body)){
                                   if(eregi("<title>(.+)</title>",$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 "<a href=$filedir target=_blank>$title </a>"."<br>\n";
}
?>

到此为止,你已经做好了自己的一个搜索引擎,你也可以通过修改内容处理部分来改进它,可以实现搜索标题,或者搜索内容的功能。也可以考虑分页。这些都留给你自己吧。

这里说明一下用preg_match代替eregi,会快很多。这里只是为了通俗易懂,所以使用了常用的eregi.

1111111

欢迎做客蔡坚植艺术工作室-书画家俱乐部
动网论坛PHP官方站点
引用 | 回复 | TOP

帅哥哟,离线,有人找我吗?

头衔:QQ群:2805390

等级:版主

文章:5550

积分:781

注册:2003-06-22 15:01:00

沙发  2008-06-22 15:19:01  
顶!谢谢蔡老师!!!
动网论坛商业版热卖中

日日深杯酒满,朝朝小圃花开,自歌自舞自开怀,无拘无束无碍。
青史几番春梦,红尘多少奇才,不消计较与安排,领取而今现在!

动网·网络社区源动力
引用 | 回复 | TOP

美女呀,离线,留言给我吧!

头衔: 永远的天使

等级:管理员

威望:1

文章:12499

积分:35431

注册:2003-09-11 17:38:00

板凳  2008-06-22 15:30:21  

蔡先生出手不凡,支持!

动网论坛商业版热卖中

  现在不常上QQ,为了您的问题能得到尽快解决,请在技术区发帖提问。

  敬请注意,谢谢理解!

动网论坛商业版热卖中
引用 | 回复 | TOP

帅哥哟,离线,有人找我吗?

等级:新手上路

文章:21

积分:333

注册:2005-05-14 04:58:00

木地板  2008-06-23 11:57:23  

貌似这玩意只对生成HTML静态版的有用吧?

如果是数据库版的话?有啥好的解决方法麽?

111111
动网论坛商业版热卖中
引用 | 回复 | TOP

帅哥哟,离线,有人找我吗?

头衔:动网.php技术支持

等级:动网团队

文章:1991

积分:4899

注册:2004-03-26 18:11:00

5  2008-06-23 14:14:26  

dddddddddddddddddd

动网论坛PHP官方站点
动网论坛商业版热卖中
引用 | 回复 | TOP

帅哥哟,离线,有人找我吗?

头衔:被爱情驱赶

等级:新手上路

文章:959

积分:530

注册:2005-11-14 18:15:00

6  2008-06-25 19:34:15  

有谁用了给个演示啊

动网论坛商业版热卖中

http://www.flyinger.com
灵动水滴原创文学网
动网·网络社区源动力
引用 | 回复 | TOP

美女呀,离线,留言给我吧!

头衔: 永远的天使

等级:管理员

威望:1

文章:12499

积分:35431

注册:2003-09-11 17:38:00

7  2008-06-25 19:52:56  
小水滴什么都想要,你的论坛顶站就有搜索。还要什么?
动网论坛商业版热卖中

  现在不常上QQ,为了您的问题能得到尽快解决,请在技术区发帖提问。

  敬请注意,谢谢理解!

动网论坛商业版热卖中
引用 | 回复 | TOP

帅哥哟,离线,有人找我吗?

等级:论坛游民

文章:155

积分:991

注册:2008-05-21 20:43:34

8  2008-06-29 14:26:45  
不懂呀····
111111

美女潮人尽在1升爱论坛:http://www.1shengai.com
动网论坛专用虚拟主机
引用 | 回复 | TOP

美女呀,离线,留言给我吧!

头衔: 永远的天使

等级:管理员

威望:1

文章:12499

积分:35431

注册:2003-09-11 17:38:00

9  2008-06-29 14:28:42  
楼上的朋友,先好好学习教程,熟悉熟悉自己的坛子,逐渐地就懂了。
动网论坛商业版热卖中

  现在不常上QQ,为了您的问题能得到尽快解决,请在技术区发帖提问。

  敬请注意,谢谢理解!

动网论坛PHP官方站点
引用 | 回复 | TOP

帅哥哟,离线,有人找我吗?

头衔:亲爱的

等级:版主

文章:3044

积分:2279

注册:2008-05-07 18:02:05

10  2008-06-29 15:55:13  
谢谢蔡老师的指点!恩....google 是不是已经推出这个了?
动网论坛商业版热卖中


&lt;p&gt;&lt;a href=&quot;http://www.netlanglin.cn&quot;&gt;在线疯玩&lt;/a&gt;&lt;a href=&quot;http://game.langlin.net&quot;&gt;网页游戏&lt;/a&gt;&lt;/p&gt;
动网论坛PHP官方站点
引用 | 回复 | TOP

13 / 回复数 1/2 12 GO