做个自己站内搜索引擎


Posted in PHP onOctober 09, 2006

ccterran(原作)

作者:iwind

  朋友用dreamweaver做了一个网站,没有动态的内容,只是一些个人收藏的文章,个人介绍等等。现在内容比较多了,想叫我帮他做一个搜索引擎。说实在的,这是一个不难的问题,于是就随手做了一个。现在我在其它论坛上也看到有人想做这个,于是就想说说这方面的知识,重在了解一下方法。

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

 

PHP 相关文章推荐
PHP小程序自动提交到自助友情连接
Nov 24 PHP
php获取url字符串截取路径的文件名和扩展名的函数
Jan 22 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
Mar 13 PHP
PHP查询MySQL大量数据的时候内存占用分析
Jul 22 PHP
php不使用插件导出excel的简单方法
Mar 04 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
php实现encode64编码类实例
Mar 24 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
Feb 14 PHP
老生常谈PHP面向对象之解释器模式
May 17 PHP
PHP判断密码强度的方法详解
May 26 PHP
PHP中上传文件打印错误错误类型分析
Apr 14 PHP
php适配器模式简单应用示例
Oct 23 PHP
用libTemplate实现静态网页的生成
Oct 09 #PHP
php注入实例
Oct 09 #PHP
967 个函式
Oct 09 #PHP
如何给phpadmin一个保护
Oct 09 #PHP
Search Engine Friendly的URL设计
Oct 09 #PHP
PHPlet在Windows下的安装
Oct 09 #PHP
一棵php的类树(支持无限分类)
Oct 09 #PHP
You might like
PHP 网页过期时间的控制代码
2009/06/29 PHP
PHP strtotime函数详解
2009/12/18 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
2014/11/12 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
理解JavaScript中的对象 推荐
2011/01/09 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
QML使用Python的函数过程解析
2019/09/26 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
css3 按钮样式简单可扩展创建
2013/03/18 HTML / CSS
暑期社会实践心得体会
2014/09/02 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
匿名检举信范文
2015/03/02 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python
MYSQL常用函数介绍
2022/05/05 MySQL