正文

php做站内搜索2006-11-04 14:28:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/5ibc/19979.html

分享到:

写程序前先要想好一个思路,下面是我的思路,可能谁有更好的,但注意这只是一个方法问题 :遍历所有文件 &#61664; 读取内容 &#61664; 搜索关键字,如果匹配就放入一个数组 &#61664; 读数组。在实现这些步骤之前,我假定你的网页都是标准的,就是有标题(<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分钟为限。所以完整的程序就是<?phpset_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.

阅读(2867) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册