加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

php实现站内(静态html)搜索代码

(2011-04-13 21:17:15)
标签:

数组

代码

遍历

搜索关键字

复制

hamelong

爱家乡网

动态网页

seo

搜索引

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

一,设计搜索表单
在网站的根目录下建个search.htm,内容如下:

 

  1. <html>
  2. <head>
  3. <title> 搜索表单</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. </head>

  6. <body bgcolor="#FFFFFF" text="#000000">
  7. <form name="form1" method="post" action="search.php">
  8. <table width="100%" cellspacing="0" cellpadding="0">
  9. <tr>
  10. <td width="36%">
  11. <div align="center">
  12. <input type="text" name="keyword">
  13. </div>
  14. </td>
  15. <td width="64%">
  16. <input type="submit" name="Submit" value="搜索">
  17. </td>
  18. </tr>
  19. </table>
  20. </form>
  21. </body>
  22. </html>
复制代码

 


二,搜索程序
再在根目录下建个search.php
的文件,用来处理search.htm表单传过来的数据.内容如下

 

  1. <?php
  2. // 获取搜索关键字
  3. $keyword=trim($_POST[“keyword”]);
  4. //检查是否为空
  5. if($keyword==””){
  6. echo” 您要搜索的关键字不能为空”;
  7. exit;//结束程序
  8. }
  9. ?>
复制代码

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

我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.

 

 

  1. <?php
  2. // 遍历所有文件的函数
  3. function listFiles($dir){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. // 如果是目录就继续搜索
  8. if(is_dir("$dir/$file")){
  9. listFiles("$dir/$file");
  10. }
  11. else{
  12. // 在这里进行处理
  13. }
  14. }
  15. }
  16. }

  17. ?>
复制代码

 


在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋 给一个数组。

  1. <?php
  2. //$dir是搜索的目录,$keyword是搜索的关键字 ,$array是存放的数组
  3. function listFiles($dir,$keyword,&$array){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. if(is_dir("$dir/$file")){
  8. listFiles("$dir/$file",$keyword,$array);
  9. }
  10. else{
  11. // 读取文件内容
  12. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  13. // 不搜索自身
  14. if($file!=”search.php”){
  15. //是否匹配
  16. if(eregi("$keyword",$data)){
  17. $array[]="$dir/$file";
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. // 定义数组$array
  25. $array=array();
  26. //执行函数
  27. listFiles(".","php",$array);
  28. // 打印搜索结果
  29. foreach($array as $value){
  30. echo "$value"."<br>\n";
  31. }
  32. ?>
复制代码

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

 


1, 列出内容的标题

  1. if(eregi("$keyword",$data)){
  2. $array[]="$dir/$file";
  3. }
  4. 改 成
  5. if(eregi("$keyword",$data)){
  6. if(eregi("<title>(.+)</title>",$data,$m)){
  7. $title=$m["1"];
  8. }
  9. else{
  10. $title=" 没有标题";
  11. }
  12. $array[]="$dir/$file $title";
  13. }
复制代码

原理就是,如果在文件内容中找 到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.

 

2,只搜索网页的内容的主题部分。
做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表 达式和strip_tags的配合,并不能把所有的都去掉。

  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码
  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码

改成

 


  1. foreach($array as $value){
  2. //拆 开
  3. list($filedir,$title)=split(“[ ]”,$value,”2”);
  4. //输出
  5. echo "<a href=$filedir>$value</a>"."<br>\n";
  6. }
复制代码

4防止超时
如 果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上
set_time_limit(“600”);
以秒为单位,所以上 面是设10分钟为限。

 


所以完整的程序就是

 

  1. <?php
  2. set_time_limit("600");
  3. //获取搜索关键字
  4. $keyword=trim($_POST["keyword"]);
  5. // 检查是否为空
  6. if($keyword==""){
  7. echo"您要搜索的关键字不能为空";
  8. exit;//结束程序
  9. }
  10. function listFiles($dir,$keyword,&$array){
  11. $handle=opendir($dir);
  12. while(false!==($file=readdir($handle))){
  13. if($file!="."&&$file!=".."){
  14. if(is_dir("$dir/$file")){
  15. listFiles("$dir/$file",$keyword,$array);
  16. }
  17. else{
  18. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  19. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  20. $body=strip_tags($b["2"]);
  21. }
  22. else{
  23. $body=strip_tags($data);
  24. }
  25. if($file!="search.php"){
  26. if(eregi("$keyword",$body)){
  27. if(eregi("<title>(.+)</title>",$data,$m)){
  28. $title=$m["1"];
  29. }
  30. else{
  31. $title=" 没有标题";
  32. }
  33. $array[]="$dir/$file $title";
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. $array=array();
  41. listFiles(".","$keyword",$array);
  42. foreach($array as $value){
  43. //拆开
  44. list($filedir,$title)=split("[ ]",$value,"2");
  45. // 输出
  46. echo "<a href=$filedir target=_blank>$title </a>"."<br>\n";
  47. }
  48. ?>
复制代码

 

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

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


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

一,设计搜索表单
在网站的根目录下建个search.htm,内容如下:

 

  1. <html>
  2. <head>
  3. <title> 搜索表单</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. </head>

  6. <body bgcolor="#FFFFFF" text="#000000">
  7. <form name="form1" method="post" action="search.php">
  8. <table width="100%" cellspacing="0" cellpadding="0">
  9. <tr>
  10. <td width="36%">
  11. <div align="center">
  12. <input type="text" name="keyword">
  13. </div>
  14. </td>
  15. <td width="64%">
  16. <input type="submit" name="Submit" value="搜索">
  17. </td>
  18. </tr>
  19. </table>
  20. </form>
  21. </body>
  22. </html>
复制代码

 


二,搜索程序
再在根目录下建个search.php
的文件,用来处理search.htm表单传过来的数据.内容如下

 

  1. <?php
  2. // 获取搜索关键字
  3. $keyword=trim($_POST[“keyword”]);
  4. //检查是否为空
  5. if($keyword==””){
  6. echo” 您要搜索的关键字不能为空”;
  7. exit;//结束程序
  8. }
  9. ?>
复制代码

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

我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.

 

 

  1. <?php
  2. // 遍历所有文件的函数
  3. function listFiles($dir){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. // 如果是目录就继续搜索
  8. if(is_dir("$dir/$file")){
  9. listFiles("$dir/$file");
  10. }
  11. else{
  12. // 在这里进行处理
  13. }
  14. }
  15. }
  16. }

  17. ?>
复制代码

 


在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋 给一个数组。

  1. <?php
  2. //$dir是搜索的目录,$keyword是搜索的关键字 ,$array是存放的数组
  3. function listFiles($dir,$keyword,&$array){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. if(is_dir("$dir/$file")){
  8. listFiles("$dir/$file",$keyword,$array);
  9. }
  10. else{
  11. // 读取文件内容
  12. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  13. // 不搜索自身
  14. if($file!=”search.php”){
  15. //是否匹配
  16. if(eregi("$keyword",$data)){
  17. $array[]="$dir/$file";
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. // 定义数组$array
  25. $array=array();
  26. //执行函数
  27. listFiles(".","php",$array);
  28. // 打印搜索结果
  29. foreach($array as $value){
  30. echo "$value"."<br>\n";
  31. }
  32. ?>
复制代码

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

 


1, 列出内容的标题

  1. if(eregi("$keyword",$data)){
  2. $array[]="$dir/$file";
  3. }
  4. 改 成
  5. if(eregi("$keyword",$data)){
  6. if(eregi("<title>(.+)</title>",$data,$m)){
  7. $title=$m["1"];
  8. }
  9. else{
  10. $title=" 没有标题";
  11. }
  12. $array[]="$dir/$file $title";
  13. }
复制代码

原理就是,如果在文件内容中找 到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.

 

2,只搜索网页的内容的主题部分。
做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表 达式和strip_tags的配合,并不能把所有的都去掉。

  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码
  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码

改成

 


  1. foreach($array as $value){
  2. //拆 开
  3. list($filedir,$title)=split(“[ ]”,$value,”2”);
  4. //输出
  5. echo "<a href=$filedir>$value</a>"."<br>\n";
  6. }
复制代码

4防止超时
如 果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上
set_time_limit(“600”);
以秒为单位,所以上 面是设10分钟为限。

 


所以完整的程序就是

 

  1. <?php
  2. set_time_limit("600");
  3. //获取搜索关键字
  4. $keyword=trim($_POST["keyword"]);
  5. // 检查是否为空
  6. if($keyword==""){
  7. echo"您要搜索的关键字不能为空";
  8. exit;//结束程序
  9. }
  10. function listFiles($dir,$keyword,&$array){
  11. $handle=opendir($dir);
  12. while(false!==($file=readdir($handle))){
  13. if($file!="."&&$file!=".."){
  14. if(is_dir("$dir/$file")){
  15. listFiles("$dir/$file",$keyword,$array);
  16. }
  17. else{
  18. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  19. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  20. $body=strip_tags($b["2"]);
  21. }
  22. else{
  23. $body=strip_tags($data);
  24. }
  25. if($file!="search.php"){
  26. if(eregi("$keyword",$body)){
  27. if(eregi("<title>(.+)</title>",$data,$m)){
  28. $title=$m["1"];
  29. }
  30. else{
  31. $title=" 没有标题";
  32. }
  33. $array[]="$dir/$file $title";
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. $array=array();
  41. listFiles(".","$keyword",$array);
  42. foreach($array as $value){
  43. //拆开
  44. list($filedir,$title)=split("[ ]",$value,"2");
  45. // 输出
  46. echo "<a href=$filedir target=_blank>$title </a>"."<br>\n";
  47. }
  48. ?>
复制代码

 

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

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


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

一,设计搜索表单
在网站的根目录下建个search.htm,内容如下:

 

  1. <html>
  2. <head>
  3. <title> 搜索表单</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. </head>

  6. <body bgcolor="#FFFFFF" text="#000000">
  7. <form name="form1" method="post" action="search.php">
  8. <table width="100%" cellspacing="0" cellpadding="0">
  9. <tr>
  10. <td width="36%">
  11. <div align="center">
  12. <input type="text" name="keyword">
  13. </div>
  14. </td>
  15. <td width="64%">
  16. <input type="submit" name="Submit" value="搜索">
  17. </td>
  18. </tr>
  19. </table>
  20. </form>
  21. </body>
  22. </html>
复制代码

 


二,搜索程序
再在根目录下建个search.php
的文件,用来处理search.htm表单传过来的数据.内容如下

 

  1. <?php
  2. // 获取搜索关键字
  3. $keyword=trim($_POST[“keyword”]);
  4. //检查是否为空
  5. if($keyword==””){
  6. echo” 您要搜索的关键字不能为空”;
  7. exit;//结束程序
  8. }
  9. ?>
复制代码

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

我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.

 

 

  1. <?php
  2. // 遍历所有文件的函数
  3. function listFiles($dir){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. // 如果是目录就继续搜索
  8. if(is_dir("$dir/$file")){
  9. listFiles("$dir/$file");
  10. }
  11. else{
  12. // 在这里进行处理
  13. }
  14. }
  15. }
  16. }

  17. ?>
复制代码

 


在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋 给一个数组。

  1. <?php
  2. //$dir是搜索的目录,$keyword是搜索的关键字 ,$array是存放的数组
  3. function listFiles($dir,$keyword,&$array){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. if(is_dir("$dir/$file")){
  8. listFiles("$dir/$file",$keyword,$array);
  9. }
  10. else{
  11. // 读取文件内容
  12. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  13. // 不搜索自身
  14. if($file!=”search.php”){
  15. //是否匹配
  16. if(eregi("$keyword",$data)){
  17. $array[]="$dir/$file";
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. // 定义数组$array
  25. $array=array();
  26. //执行函数
  27. listFiles(".","php",$array);
  28. // 打印搜索结果
  29. foreach($array as $value){
  30. echo "$value"."<br>\n";
  31. }
  32. ?>
复制代码

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

 


1, 列出内容的标题

  1. if(eregi("$keyword",$data)){
  2. $array[]="$dir/$file";
  3. }
  4. 改 成
  5. if(eregi("$keyword",$data)){
  6. if(eregi("<title>(.+)</title>",$data,$m)){
  7. $title=$m["1"];
  8. }
  9. else{
  10. $title=" 没有标题";
  11. }
  12. $array[]="$dir/$file $title";
  13. }
复制代码

原理就是,如果在文件内容中找 到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.

 

2,只搜索网页的内容的主题部分。
做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表 达式和strip_tags的配合,并不能把所有的都去掉。

  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码
  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码

改成

 


  1. foreach($array as $value){
  2. //拆 开
  3. list($filedir,$title)=split(“[ ]”,$value,”2”);
  4. //输出
  5. echo "<a href=$filedir>$value</a>"."<br>\n";
  6. }
复制代码

4防止超时
如 果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上
set_time_limit(“600”);
以秒为单位,所以上 面是设10分钟为限。

 


所以完整的程序就是

 

  1. <?php
  2. set_time_limit("600");
  3. //获取搜索关键字
  4. $keyword=trim($_POST["keyword"]);
  5. // 检查是否为空
  6. if($keyword==""){
  7. echo"您要搜索的关键字不能为空";
  8. exit;//结束程序
  9. }
  10. function listFiles($dir,$keyword,&$array){
  11. $handle=opendir($dir);
  12. while(false!==($file=readdir($handle))){
  13. if($file!="."&&$file!=".."){
  14. if(is_dir("$dir/$file")){
  15. listFiles("$dir/$file",$keyword,$array);
  16. }
  17. else{
  18. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  19. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  20. $body=strip_tags($b["2"]);
  21. }
  22. else{
  23. $body=strip_tags($data);
  24. }
  25. if($file!="search.php"){
  26. if(eregi("$keyword",$body)){
  27. if(eregi("<title>(.+)</title>",$data,$m)){
  28. $title=$m["1"];
  29. }
  30. else{
  31. $title=" 没有标题";
  32. }
  33. $array[]="$dir/$file $title";
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. $array=array();
  41. listFiles(".","$keyword",$array);
  42. foreach($array as $value){
  43. //拆开
  44. list($filedir,$title)=split("[ ]",$value,"2");
  45. // 输出
  46. echo "<a href=$filedir target=_blank>$title </a>"."<br>\n";
  47. }
  48. ?>
复制代码

 

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

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


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

一,设计搜索表单
在网站的根目录下建个search.htm,内容如下:

 

  1. <html>
  2. <head>
  3. <title> 搜索表单</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. </head>

  6. <body bgcolor="#FFFFFF" text="#000000">
  7. <form name="form1" method="post" action="search.php">
  8. <table width="100%" cellspacing="0" cellpadding="0">
  9. <tr>
  10. <td width="36%">
  11. <div align="center">
  12. <input type="text" name="keyword">
  13. </div>
  14. </td>
  15. <td width="64%">
  16. <input type="submit" name="Submit" value="搜索">
  17. </td>
  18. </tr>
  19. </table>
  20. </form>
  21. </body>
  22. </html>
复制代码

 


二,搜索程序
再在根目录下建个search.php
的文件,用来处理search.htm表单传过来的数据.内容如下

 

  1. <?php
  2. // 获取搜索关键字
  3. $keyword=trim($_POST[“keyword”]);
  4. //检查是否为空
  5. if($keyword==””){
  6. echo” 您要搜索的关键字不能为空”;
  7. exit;//结束程序
  8. }
  9. ?>
复制代码

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

我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.

 

 

  1. <?php
  2. // 遍历所有文件的函数
  3. function listFiles($dir){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. // 如果是目录就继续搜索
  8. if(is_dir("$dir/$file")){
  9. listFiles("$dir/$file");
  10. }
  11. else{
  12. // 在这里进行处理
  13. }
  14. }
  15. }
  16. }

  17. ?>
复制代码

 


在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋 给一个数组。

  1. <?php
  2. //$dir是搜索的目录,$keyword是搜索的关键字 ,$array是存放的数组
  3. function listFiles($dir,$keyword,&$array){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. if(is_dir("$dir/$file")){
  8. listFiles("$dir/$file",$keyword,$array);
  9. }
  10. else{
  11. // 读取文件内容
  12. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  13. // 不搜索自身
  14. if($file!=”search.php”){
  15. //是否匹配
  16. if(eregi("$keyword",$data)){
  17. $array[]="$dir/$file";
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. // 定义数组$array
  25. $array=array();
  26. //执行函数
  27. listFiles(".","php",$array);
  28. // 打印搜索结果
  29. foreach($array as $value){
  30. echo "$value"."<br>\n";
  31. }
  32. ?>
复制代码

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

 


1, 列出内容的标题

  1. if(eregi("$keyword",$data)){
  2. $array[]="$dir/$file";
  3. }
  4. 改 成
  5. if(eregi("$keyword",$data)){
  6. if(eregi("<title>(.+)</title>",$data,$m)){
  7. $title=$m["1"];
  8. }
  9. else{
  10. $title=" 没有标题";
  11. }
  12. $array[]="$dir/$file $title";
  13. }
复制代码

原理就是,如果在文件内容中找 到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.

 

2,只搜索网页的内容的主题部分。
做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表 达式和strip_tags的配合,并不能把所有的都去掉。

  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码
  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码

改成

 


  1. foreach($array as $value){
  2. //拆 开
  3. list($filedir,$title)=split(“[ ]”,$value,”2”);
  4. //输出
  5. echo "<a href=$filedir>$value</a>"."<br>\n";
  6. }
复制代码

4防止超时
如 果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上
set_time_limit(“600”);
以秒为单位,所以上 面是设10分钟为限。

 


所以完整的程序就是

 

  1. <?php
  2. set_time_limit("600");
  3. //获取搜索关键字
  4. $keyword=trim($_POST["keyword"]);
  5. // 检查是否为空
  6. if($keyword==""){
  7. echo"您要搜索的关键字不能为空";
  8. exit;//结束程序
  9. }
  10. function listFiles($dir,$keyword,&$array){
  11. $handle=opendir($dir);
  12. while(false!==($file=readdir($handle))){
  13. if($file!="."&&$file!=".."){
  14. if(is_dir("$dir/$file")){
  15. listFiles("$dir/$file",$keyword,$array);
  16. }
  17. else{
  18. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  19. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  20. $body=strip_tags($b["2"]);
  21. }
  22. else{
  23. $body=strip_tags($data);
  24. }
  25. if($file!="search.php"){
  26. if(eregi("$keyword",$body)){
  27. if(eregi("<title>(.+)</title>",$data,$m)){
  28. $title=$m["1"];
  29. }
  30. else{
  31. $title=" 没有标题";
  32. }
  33. $array[]="$dir/$file $title";
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. $array=array();
  41. listFiles(".","$keyword",$array);
  42. foreach($array as $value){
  43. //拆开
  44. list($filedir,$title)=split("[ ]",$value,"2");
  45. // 输出
  46. echo "<a href=$filedir target=_blank>$title </a>"."<br>\n";
  47. }
  48. ?>
复制代码

 

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

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


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

一,设计搜索表单
在网站的根目录下建个search.htm,内容如下:

 

  1. <html>
  2. <head>
  3. <title> 搜索表单</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. </head>

  6. <body bgcolor="#FFFFFF" text="#000000">
  7. <form name="form1" method="post" action="search.php">
  8. <table width="100%" cellspacing="0" cellpadding="0">
  9. <tr>
  10. <td width="36%">
  11. <div align="center">
  12. <input type="text" name="keyword">
  13. </div>
  14. </td>
  15. <td width="64%">
  16. <input type="submit" name="Submit" value="搜索">
  17. </td>
  18. </tr>
  19. </table>
  20. </form>
  21. </body>
  22. </html>
复制代码

 


二,搜索程序
再在根目录下建个search.php
的文件,用来处理search.htm表单传过来的数据.内容如下

 

  1. <?php
  2. // 获取搜索关键字
  3. $keyword=trim($_POST[“keyword”]);
  4. //检查是否为空
  5. if($keyword==””){
  6. echo” 您要搜索的关键字不能为空”;
  7. exit;//结束程序
  8. }
  9. ?>
复制代码

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

我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.

 

 

  1. <?php
  2. // 遍历所有文件的函数
  3. function listFiles($dir){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. // 如果是目录就继续搜索
  8. if(is_dir("$dir/$file")){
  9. listFiles("$dir/$file");
  10. }
  11. else{
  12. // 在这里进行处理
  13. }
  14. }
  15. }
  16. }

  17. ?>
复制代码

 


在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋 给一个数组。

  1. <?php
  2. //$dir是搜索的目录,$keyword是搜索的关键字 ,$array是存放的数组
  3. function listFiles($dir,$keyword,&$array){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. if(is_dir("$dir/$file")){
  8. listFiles("$dir/$file",$keyword,$array);
  9. }
  10. else{
  11. // 读取文件内容
  12. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  13. // 不搜索自身
  14. if($file!=”search.php”){
  15. //是否匹配
  16. if(eregi("$keyword",$data)){
  17. $array[]="$dir/$file";
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. // 定义数组$array
  25. $array=array();
  26. //执行函数
  27. listFiles(".","php",$array);
  28. // 打印搜索结果
  29. foreach($array as $value){
  30. echo "$value"."<br>\n";
  31. }
  32. ?>
复制代码

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

 


1, 列出内容的标题

  1. if(eregi("$keyword",$data)){
  2. $array[]="$dir/$file";
  3. }
  4. 改 成
  5. if(eregi("$keyword",$data)){
  6. if(eregi("<title>(.+)</title>",$data,$m)){
  7. $title=$m["1"];
  8. }
  9. else{
  10. $title=" 没有标题";
  11. }
  12. $array[]="$dir/$file $title";
  13. }
复制代码

原理就是,如果在文件内容中找 到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.

 

2,只搜索网页的内容的主题部分。
做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表 达式和strip_tags的配合,并不能把所有的都去掉。

  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码
  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码

改成

 


  1. foreach($array as $value){
  2. //拆 开
  3. list($filedir,$title)=split(“[ ]”,$value,”2”);
  4. //输出
  5. echo "<a href=$filedir>$value</a>"."<br>\n";
  6. }
复制代码

4防止超时
如 果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上
set_time_limit(“600”);
以秒为单位,所以上 面是设10分钟为限。

 


所以完整的程序就是

 

  1. <?php
  2. set_time_limit("600");
  3. //获取搜索关键字
  4. $keyword=trim($_POST["keyword"]);
  5. // 检查是否为空
  6. if($keyword==""){
  7. echo"您要搜索的关键字不能为空";
  8. exit;//结束程序
  9. }
  10. function listFiles($dir,$keyword,&$array){
  11. $handle=opendir($dir);
  12. while(false!==($file=readdir($handle))){
  13. if($file!="."&&$file!=".."){
  14. if(is_dir("$dir/$file")){
  15. listFiles("$dir/$file",$keyword,$array);
  16. }
  17. else{
  18. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  19. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  20. $body=strip_tags($b["2"]);
  21. }
  22. else{
  23. $body=strip_tags($data);
  24. }
  25. if($file!="search.php"){
  26. if(eregi("$keyword",$body)){
  27. if(eregi("<title>(.+)</title>",$data,$m)){
  28. $title=$m["1"];
  29. }
  30. else{
  31. $title=" 没有标题";
  32. }
  33. $array[]="$dir/$file $title";
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. $array=array();
  41. listFiles(".","$keyword",$array);
  42. foreach($array as $value){
  43. //拆开
  44. list($filedir,$title)=split("[ ]",$value,"2");
  45. // 输出
  46. echo "<a href=$filedir target=_blank>$title </a>"."<br>\n";
  47. }
  48. ?>
复制代码

 

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

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


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

一,设计搜索表单
在网站的根目录下建个search.htm,内容如下:

 

  1. <html>
  2. <head>
  3. <title> 搜索表单</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. </head>

  6. <body bgcolor="#FFFFFF" text="#000000">
  7. <form name="form1" method="post" action="search.php">
  8. <table width="100%" cellspacing="0" cellpadding="0">
  9. <tr>
  10. <td width="36%">
  11. <div align="center">
  12. <input type="text" name="keyword">
  13. </div>
  14. </td>
  15. <td width="64%">
  16. <input type="submit" name="Submit" value="搜索">
  17. </td>
  18. </tr>
  19. </table>
  20. </form>
  21. </body>
  22. </html>
复制代码

 


二,搜索程序
再在根目录下建个search.php
的文件,用来处理search.htm表单传过来的数据.内容如下

 

  1. <?php
  2. // 获取搜索关键字
  3. $keyword=trim($_POST[“keyword”]);
  4. //检查是否为空
  5. if($keyword==””){
  6. echo” 您要搜索的关键字不能为空”;
  7. exit;//结束程序
  8. }
  9. ?>
复制代码

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

我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.

 

 

  1. <?php
  2. // 遍历所有文件的函数
  3. function listFiles($dir){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. // 如果是目录就继续搜索
  8. if(is_dir("$dir/$file")){
  9. listFiles("$dir/$file");
  10. }
  11. else{
  12. // 在这里进行处理
  13. }
  14. }
  15. }
  16. }

  17. ?>
复制代码

 


在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋 给一个数组。

  1. <?php
  2. //$dir是搜索的目录,$keyword是搜索的关键字 ,$array是存放的数组
  3. function listFiles($dir,$keyword,&$array){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. if(is_dir("$dir/$file")){
  8. listFiles("$dir/$file",$keyword,$array);
  9. }
  10. else{
  11. // 读取文件内容
  12. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  13. // 不搜索自身
  14. if($file!=”search.php”){
  15. //是否匹配
  16. if(eregi("$keyword",$data)){
  17. $array[]="$dir/$file";
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. // 定义数组$array
  25. $array=array();
  26. //执行函数
  27. listFiles(".","php",$array);
  28. // 打印搜索结果
  29. foreach($array as $value){
  30. echo "$value"."<br>\n";
  31. }
  32. ?>
复制代码

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

 


1, 列出内容的标题

  1. if(eregi("$keyword",$data)){
  2. $array[]="$dir/$file";
  3. }
  4. 改 成
  5. if(eregi("$keyword",$data)){
  6. if(eregi("<title>(.+)</title>",$data,$m)){
  7. $title=$m["1"];
  8. }
  9. else{
  10. $title=" 没有标题";
  11. }
  12. $array[]="$dir/$file $title";
  13. }
复制代码

原理就是,如果在文件内容中找 到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.

 

2,只搜索网页的内容的主题部分。
做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表 达式和strip_tags的配合,并不能把所有的都去掉。

  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码
  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码

改成

 


  1. foreach($array as $value){
  2. //拆 开
  3. list($filedir,$title)=split(“[ ]”,$value,”2”);
  4. //输出
  5. echo "<a href=$filedir>$value</a>"."<br>\n";
  6. }
复制代码

4防止超时
如 果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上
set_time_limit(“600”);
以秒为单位,所以上 面是设10分钟为限。

 


所以完整的程序就是

 

  1. <?php
  2. set_time_limit("600");
  3. //获取搜索关键字
  4. $keyword=trim($_POST["keyword"]);
  5. // 检查是否为空
  6. if($keyword==""){
  7. echo"您要搜索的关键字不能为空";
  8. exit;//结束程序
  9. }
  10. function listFiles($dir,$keyword,&$array){
  11. $handle=opendir($dir);
  12. while(false!==($file=readdir($handle))){
  13. if($file!="."&&$file!=".."){
  14. if(is_dir("$dir/$file")){
  15. listFiles("$dir/$file",$keyword,$array);
  16. }
  17. else{
  18. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  19. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  20. $body=strip_tags($b["2"]);
  21. }
  22. else{
  23. $body=strip_tags($data);
  24. }
  25. if($file!="search.php"){
  26. if(eregi("$keyword",$body)){
  27. if(eregi("<title>(.+)</title>",$data,$m)){
  28. $title=$m["1"];
  29. }
  30. else{
  31. $title=" 没有标题";
  32. }
  33. $array[]="$dir/$file $title";
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. $array=array();
  41. listFiles(".","$keyword",$array);
  42. foreach($array as $value){
  43. //拆开
  44. list($filedir,$title)=split("[ ]",$value,"2");
  45. // 输出
  46. echo "<a href=$filedir target=_blank>$title </a>"."<br>\n";
  47. }
  48. ?>
复制代码

 

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

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


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

一,设计搜索表单
在网站的根目录下建个search.htm,内容如下:

 

  1. <html>
  2. <head>
  3. <title> 搜索表单</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. </head>

  6. <body bgcolor="#FFFFFF" text="#000000">
  7. <form name="form1" method="post" action="search.php">
  8. <table width="100%" cellspacing="0" cellpadding="0">
  9. <tr>
  10. <td width="36%">
  11. <div align="center">
  12. <input type="text" name="keyword">
  13. </div>
  14. </td>
  15. <td width="64%">
  16. <input type="submit" name="Submit" value="搜索">
  17. </td>
  18. </tr>
  19. </table>
  20. </form>
  21. </body>
  22. </html>
复制代码

 


二,搜索程序
再在根目录下建个search.php
的文件,用来处理search.htm表单传过来的数据.内容如下

 

  1. <?php
  2. // 获取搜索关键字
  3. $keyword=trim($_POST[“keyword”]);
  4. //检查是否为空
  5. if($keyword==””){
  6. echo” 您要搜索的关键字不能为空”;
  7. exit;//结束程序
  8. }
  9. ?>
复制代码

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

我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.

 

 

  1. <?php
  2. // 遍历所有文件的函数
  3. function listFiles($dir){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. // 如果是目录就继续搜索
  8. if(is_dir("$dir/$file")){
  9. listFiles("$dir/$file");
  10. }
  11. else{
  12. // 在这里进行处理
  13. }
  14. }
  15. }
  16. }

  17. ?>
复制代码

 


在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋 给一个数组。

  1. <?php
  2. //$dir是搜索的目录,$keyword是搜索的关键字 ,$array是存放的数组
  3. function listFiles($dir,$keyword,&$array){
  4. $handle=opendir($dir);
  5. while(false!==($file=readdir($handle))){
  6. if($file!="."&&$file!=".."){
  7. if(is_dir("$dir/$file")){
  8. listFiles("$dir/$file",$keyword,$array);
  9. }
  10. else{
  11. // 读取文件内容
  12. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  13. // 不搜索自身
  14. if($file!=”search.php”){
  15. //是否匹配
  16. if(eregi("$keyword",$data)){
  17. $array[]="$dir/$file";
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. // 定义数组$array
  25. $array=array();
  26. //执行函数
  27. listFiles(".","php",$array);
  28. // 打印搜索结果
  29. foreach($array as $value){
  30. echo "$value"."<br>\n";
  31. }
  32. ?>
复制代码

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

 


1, 列出内容的标题

  1. if(eregi("$keyword",$data)){
  2. $array[]="$dir/$file";
  3. }
  4. 改 成
  5. if(eregi("$keyword",$data)){
  6. if(eregi("<title>(.+)</title>",$data,$m)){
  7. $title=$m["1"];
  8. }
  9. else{
  10. $title=" 没有标题";
  11. }
  12. $array[]="$dir/$file $title";
  13. }
复制代码

原理就是,如果在文件内容中找 到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.

 

2,只搜索网页的内容的主题部分。
做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表 达式和strip_tags的配合,并不能把所有的都去掉。

  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码
  1. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  2. // 不搜索自身
  3. if($file!=”search.php”){
  4. //是否匹配
  5. if(eregi("$keyword",$data)){
  6. 改 为
  7. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  8. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  9. $body=strip_tags($b["2"]);
  10. }
  11. else{
  12. $body=strip_tags($data);
  13. }
  14. if($file!="search.php"){
  15. if(eregi("$keyword",$body)){

  16. 3,标题上加链接
  17. foreach($array as $value){
  18. echo "$value"."<br>\n";
  19. }
复制代码

改成

 


  1. foreach($array as $value){
  2. //拆 开
  3. list($filedir,$title)=split(“[ ]”,$value,”2”);
  4. //输出
  5. echo "<a href=$filedir>$value</a>"."<br>\n";
  6. }
复制代码

4防止超时
如 果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上
set_time_limit(“600”);
以秒为单位,所以上 面是设10分钟为限。

 


所以完整的程序就是

 

  1. <?php
  2. set_time_limit("600");
  3. //获取搜索关键字
  4. $keyword=trim($_POST["keyword"]);
  5. // 检查是否为空
  6. if($keyword==""){
  7. echo"您要搜索的关键字不能为空";
  8. exit;//结束程序
  9. }
  10. function listFiles($dir,$keyword,&$array){
  11. $handle=opendir($dir);
  12. while(false!==($file=readdir($handle))){
  13. if($file!="."&&$file!=".."){
  14. if(is_dir("$dir/$file")){
  15. listFiles("$dir/$file",$keyword,$array);
  16. }
  17. else{
  18. $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
  19. if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){
  20. $body=strip_tags($b["2"]);
  21. }
  22. else{
  23. $body=strip_tags($data);
  24. }
  25. if($file!="search.php"){
  26. if(eregi("$keyword",$body)){
  27. if(eregi("<title>(.+)</title>",$data,$m)){
  28. $title=$m["1"];
  29. }
  30. else{
  31. $title=" 没有标题";
  32. }
  33. $array[]="$dir/$file $title";
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. $array=array();
  41. listFiles(".","$keyword",$array);
  42. foreach($array as $value){
  43. //拆开
  44. list($filedir,$title)=split("[ ]",$value,"2");
  45. // 输出
  46. echo "<a href=$filedir target=_blank>$title </a>"."<br>\n";
  47. }
  48. ?>
复制代码

 

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

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


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

一,设计搜索表单
在网站的根目录下建个search.htm,内容如下:


01.<html>

02.<head>

03.<title> 搜索表单</title>

04.<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

05.</head>

06.

07.<body bgcolor="#FFFFFF" text="#000000">

08.<form name="form1" method="post" action="search.php">

09.<table width="100%" cellspacing="0" cellpadding="0">

10.<tr>

11.<td width="36%">

12.<div align="center">

13.<input type="text" name="keyword">

14.</div>

15.</td>

16.<td width="64%">

17.<input type="submit" name="Submit" value="搜索">

18.</td>

19.</tr>

20.</table>

21.</form>

22.</body>

23.</html>
复制代码

 

二,搜索程序
再在根目录下建个search.php
的文件,用来处理search.htm表单传过来的数据.内容如下

 

01.<?php

02.// 获取搜索关键字

03.$keyword=trim($_POST[“keyword”]);

04.//检查是否为空

05.if($keyword==””){

06.echo” 您要搜索的关键字不能为空”;

07.exit;//结束程序

08.}

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

我们可以用递归的方法遍历所有的文件,可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.


01.<?php

02.// 遍历所有文件的函数

03.function listFiles($dir){

04.$handle=opendir($dir);

05.while(false!==($file=readdir($handle))){

06.if($file!="."&&$file!=".."){

07.// 如果是目录就继续搜索

08.if(is_dir("$dir/$file")){

09.listFiles("$dir/$file");

10.}

11.else{

12.// 在这里进行处理

13.}

14.}

15.}

16.}

17.

18.?>
复制代码

在红字的地方我们可以对搜索到的文件进行读取,处理.下面就是读取文件内容,并检查内容中是否含有关键字$keyword,如果含有就把文件地址赋 给一个数组。


01.<?php

02.//$dir是搜索的目录,$keyword是搜索的关键字 ,$array是存放的数组

03.function listFiles($dir,$keyword,&$array){

04.$handle=opendir($dir);

05.while(false!==($file=readdir($handle))){

06.if($file!="."&&$file!=".."){

07.if(is_dir("$dir/$file")){

08.listFiles("$dir/$file",$keyword,$array);

09.}

10.else{

11.// 读取文件内容

12.$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));

13.// 不搜索自身

14.if($file!=”search.php”){

15.//是否匹配

16.if(eregi("$keyword",$data)){

17.$array[]="$dir/$file";

18.}

19.}

20.}

21.}

22.}

23.}

24.// 定义数组$array

25.$array=array();

26.//执行函数

27.listFiles(".","php",$array);

28.// 打印搜索结果

29.foreach($array as $value){

30.echo "$value"."<br>\n";

31.}

32.?>
复制代码
现在把这个结果和开头的一段程序结合起来,输入一个关键字,然后就会发现你的网站中的相关结果都被搜索出来了。我们现在在把它完善一下。

 


1, 列出内容的标题


01.if(eregi("$keyword",$data)){

02.$array[]="$dir/$file";

03.}

04.改 成

05.if(eregi("$keyword",$data)){

06.if(eregi("<title>(.+)</title>",$data,$m)){

07.$title=$m["1"];

08.}

09.else{

10.$title=" 没有标题";

11.}

12.$array[]="$dir/$file $title";

13.}
复制代码
原理就是,如果在文件内容中找 到<title>xxx</title>,那么就把xxx取出来作为标题,如果找不到那么就把标题命名未”没有标题”.

2,只搜索网页的内容的主题部分。
做网页时一定会有很多html代码在里面,而这些都不是我们想要搜索的,所以要去除它们。我现在用正则表 达式和strip_tags的配合,并不能把所有的都去掉。

01.$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));

02.// 不搜索自身

03.if($file!=”search.php”){

04.//是否匹配

05.if(eregi("$keyword",$data)){

06.改 为

07.$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));

08.if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){

09.$body=strip_tags($b["2"]);

10.}

11.else{

12.$body=strip_tags($data);

13.}

14.if($file!="search.php"){

15.if(eregi("$keyword",$body)){

16.

17.3,标题上加链接

18.foreach($array as $value){

19.echo "$value"."<br>\n";

20.}
复制代码01.$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));

02.// 不搜索自身

03.if($file!=”search.php”){

04.//是否匹配

05.if(eregi("$keyword",$data)){

06.改 为

07.$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));

08.if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){

09.$body=strip_tags($b["2"]);

10.}

11.else{

12.$body=strip_tags($data);

13.}

14.if($file!="search.php"){

15.if(eregi("$keyword",$body)){

16.

17.3,标题上加链接

18.foreach($array as $value){

19.echo "$value"."<br>\n";

20.}
复制代码
改成

 


01.foreach($array as $value){

02.//拆 开

03.list($filedir,$title)=split(“[ ]”,$value,”2”);

04.//输出

05.echo "<a href=$filedir>$value</a>"."<br>\n";

06.}
复制代码
4防止超时
如 果文件比较多,那么防止PHP执行时间超时是必要的。可以在文件头加上
set_time_limit(“600”);
以秒为单位,所以上 面是设10分钟为限。


所以完整的程序就是

 

01.<?php

02.set_time_limit("600");

03.//获取搜索关键字

04.$keyword=trim($_POST["keyword"]);

05.// 检查是否为空

06.if($keyword==""){

07.echo"您要搜索的关键字不能为空";

08.exit;//结束程序

09.}

10.function listFiles($dir,$keyword,&$array){

11.$handle=opendir($dir);

12.while(false!==($file=readdir($handle))){

13.if($file!="."&&$file!=".."){

14.if(is_dir("$dir/$file")){

15.listFiles("$dir/$file",$keyword,$array);

16.}

17.else{

18.$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));

19.if(eregi("<body([^>]+)>(.+)</body>",$data,$b)){

20.$body=strip_tags($b["2"]);

21.}

22.else{

23.$body=strip_tags($data);

24.}

25.if($file!="search.php"){

26.if(eregi("$keyword",$body)){

27.if(eregi("<title>(.+)</title>",$data,$m)){

28.$title=$m["1"];

29.}

30.else{

31.$title=" 没有标题";

32.}

33.$array[]="$dir/$file $title";

34.}

35.}

36.}

37.}

38.}

39.}

40.$array=array();

41.listFiles(".","$keyword",$array);

42.foreach($array as $value){

43.//拆开

44.list($filedir,$title)=split("[ ]",$value,"2");

45.// 输出

46.echo "<a href=$filedir target=_blank>$title </a>"."<br>\n";

47.}

48.?>
复制代码


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

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

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有