<p> 一,设计搜索表单</p><p> 在网站的根目录下建个search.htm,内容如下</p><code><html><br /><head><br /><title>搜索表单</title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /></head><br /><body bgcolor="#FFFFFF" text="#000000"><br /><form name="form1" method="post" action="search.php"><br /><table width="100%" cellspacing="0" cellpadding="0"><br /><tr><br /><td width="36%"><br /><div align="center"><br /><input type="text" name="keyword"><br /></div><br /></td><br /><td width="64%"><br /><input type="submit" name="Submit" value="搜索"><br /></td><br /></tr><br /></table><br /></form><br /></body><br /></html></code><p> 二,搜索程序</p><p> 再在根目录下建个search.php 的文件,用来处理search.htm表单传过来的数据.内容如下</p><code><?php<br />//获取搜索关键字<br />$keyword=trim($_POST[“keyword”]);<br />//检查是否为空<br />if($keyword==””){<br />echo”您要搜索的关键字不能为空”;<br />exit;//结束程序<br />}<br />?></code><p> 这样如果访问者输入的关键字为空时,可以做出提示。下面是遍历所有文件。</p><p> 我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.</p>
<p> </p>
<code><?php<br />//遍历所有文件的函数<br />function listFiles($dir){<br />$handle=opendir($dir);<br />while(false!==($file=readdir($handle))){<br />if($file!="."&&$file!=".."){<br />//如果是目录就继续搜索<br />if(is_dir("$dir/$file")){<br />listFiles("$dir/$file");<br />}<br />else{<br />//在这里进行处理<br />}<br />}<br />}<br />}<br />?></code><p> 在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋给一个数组。</p><code><?php<br />//$dir是搜索的目录,$keyword是搜索的关键字 ,$array是存放的数组<br />function listFiles($dir,$keyword,&$array){<br />$handle=opendir($dir);<br />while(false!==($file=readdir($handle))){<br />if($file!="."&&$file!=".."){<br />if(is_dir("$dir/$file")){<br />listFiles("$dir/$file",$keyword,$array);<br />}<br />else{<br />//读取文件内容<br />$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));<br />//不搜索自身<br />if($file!=”search.php”){<br />//是否匹配<br />if(eregi("$keyword",$data)){<br />$array[]="$dir/$file";<br />}<br />}<br />}<br />}<br />}<br />}<br />//定义数组$array<br />$array=array();<br />//执行函数<br />listFiles(".","php",$array);<br />//打印搜索结果<br />foreach($array as $value){<br />echo "$value"."<br> ";<br />}<br />?></code><p> 现在把这个结果和开头的一段程序结合起来,输入一个关键字,然后就会发现你的网站中的相关结果都被搜索出来了。我们现在在把它完善一下。</p>
<p> </p>
<p> 1,列出内容的标题</p><p> 把</p><code>if(eregi("$keyword",$data)){<br />$array[]="$dir/$file";<br />}</code><p> 改成</p><code>if(eregi("$keyword",$data)){<br />if(eregi("<title>(.+)</title>",$data,$m)){<br />$title=$m["1"];<br />}<br />else{<br />$title="没有标题";<br />}<br />$array[]="$dir/$file $title";<br />}</code><p> 原理就是,如果在文件内容中找到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.</p><p> 2,只搜索网页的内容的主题部分。</p><p> 做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表达式和strip_tags的配合,并不能把所有的都去掉。</p><p> 把</p><code>$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));<br />//不搜索自身<br />if($file!=”search.php”){<br />//是否匹配<br />if(eregi("$keyword",$data)){</code><p> 改为</p><code>$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));<br />if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){<br />$body=strip_tags($b["2"]);<br />}<br />else{<br />$body=strip_tags($data);<br />}<br />if($file!="search.php"){<br />if(eregi("$keyword",$body)){</code><p> 3,标题上加链接</p><code>foreach($array as $value){<br />echo "$value"."<br> ";<br />}</code><p> 改成</p>
<p> </p>
<code>foreach($array as $value){<br />//拆开<br />list($filedir,$title)=split(“[ ]”,$value,”2”);<br />//输出<br />echo "<a href=$filedir>$value</a>"."<br> ";<br />}</code><p> 4防止超时</p><p> 如果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上</p><p> set_time_limit(“600”);</p><p> 以秒为单位,所以上面是设10分钟为限。</p><p> 所以完整的程序就是</p><code><?php<br />set_time_limit("600");<br />//获取搜索关键字<br />$keyword=trim($_POST["keyword"]);<br />//检查是否为空<br />if($keyword==""){<br />echo"您要搜索的关键字不能为空";<br />exit;//结束程序<br />}<br />function listFiles($dir,$keyword,&$array){<br />$handle=opendir($dir);<br />while(false!==($file=readdir($handle))){<br />if($file!="."&&$file!=".."){<br />if(is_dir("$dir/$file")){<br />listFiles("$dir/$file",$keyword,$array);<br />}<br />else{<br />$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));<br />if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){<br />$body=strip_tags($b["2"]);<br />}<br />else{<br />$body=strip_tags($data);<br />}<br />if($file!="search.php"){<br />if(eregi("$keyword",$body)){<br />if(eregi("<title>(.+)</title>",$data,$m)){<br />$title=$m["1"];<br />}<br />else{<br />$title="没有标题";<br />}<br />$array[]="$dir/$file $title";<br />}<br />}<br />}<br />}<br />}<br />}<br />$array=array();<br />listFiles(".","$keyword",$array);<br />foreach($array as $value){<br />//拆开<br />list($filedir,$title)=split("[ ]",$value,"2");<br />//输出<br />echo "<a href=$filedir target=_blank>$title </a>"."<br> ";<br />}<br />?></code><p> 到此为止,你已经做好了自己的一个搜索引擎,你也可以通过修改内容处理部分来改进它,可以实现搜索标题,或者搜索内容的功能。也可以考虑分页。这些都留给你自己吧。</p></p><p> 这里说明一下用preg_match代替eregi,会快很多。这里只是为了通俗易懂,所以使用了常用的eregi.</p></p>