用PHP程序?yàn)樽约壕W(wǎng)站打造一個搜索引擎_PHP教程
推薦:新手如何使用PHP創(chuàng)建RSS閱讀器Jacques Noah在Devshed上發(fā)表了一篇關(guān)于在PHP4與任意版本的Mysql搭建的平臺下創(chuàng)建一個基于PHP的RSS閱讀器的文章,RSS文檔中有三個主要的標(biāo)簽:Title,link和description,分別包含著像它們名稱提示
一、設(shè)計搜索表單
在網(wǎng)站的根目錄下建個search.htm,內(nèi)容如下
以下為引用的內(nèi)容: <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表單傳過來的數(shù)據(jù).內(nèi)容如下
以下為引用的內(nèi)容: <?php //獲取搜索關(guān)鍵字 $keyword=trim($_POST[“keyword”]); //檢查是否為空 if($keyword==””){ echo”您要搜索的關(guān)鍵字不能為空”; exit;//結(jié)束程序 } ?> |
這樣如果訪問者輸入的關(guān)鍵字為空時,可以做出提示。下面是遍歷所有文件。
我們可以用遞歸的方法遍歷所有的文件,可以用函數(shù)opendir,readdir,也可以用PHP Directory的類。我們現(xiàn)在用前者。
以下為引用的內(nèi)容: <?php //遍歷所有文件的函數(shù) function listFiles($dir){ $handle=opendir($dir); while(false!==($file=readdir($handle))){ if($file!="."&&$file!=".."){ //如果是目錄就繼續(xù)搜索 if(is_dir("$dir/$file")){ listFiles("$dir/$file"); } else{ //在這里進(jìn)行處理 } } } } ?> |
在紅字的地方我們可以對搜索到的文件進(jìn)行讀取,處理下面就是讀取文件內(nèi)容,并檢查內(nèi)容中是否含有關(guān)鍵字$keyword,如果含有就把文件地址賦給一個數(shù)組。
以下為引用的內(nèi)容: <?php //$dir是搜索的目錄,$keyword是搜索的關(guān)鍵字 ,$array是存放的數(shù)組 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{ //讀取文件內(nèi)容 $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file")); //不搜索自身 if($file!=”search.php”){ //是否匹配 if(eregi("$keyword",$data)){ $array[]="$dir/$file"; } } } } } } //定義數(shù)組$array $array=array(); //執(zhí)行函數(shù) listFiles(".","php",$array); //打印搜索結(jié)果 foreach($array as $value){ echo "$value"."<br> "; } ?> |
現(xiàn)在把這個結(jié)果和開頭的一段程序結(jié)合起來,輸入一個關(guān)鍵字,然后就會發(fā)現(xiàn)你的網(wǎng)站中的相關(guān)結(jié)果都被搜索出來了。我們現(xiàn)在在把它完善一下。
1、列出內(nèi)容的標(biāo)題
把
以下為引用的內(nèi)容: if(eregi("$keyword",$data)){ 改成 if(eregi("$keyword",$data)){ |
原理就是,如果在文件內(nèi)容中找到<title>xxx</title>,那么就把xxx取出來作為標(biāo)題,如果找不到那么就把標(biāo)題命名未”沒有標(biāo)題”。
2、只搜索網(wǎng)頁的內(nèi)容的主題部分。
做網(wǎng)頁時一定會有很多html代碼在里面,而這些都不是我們想要搜索的,所以要去除它們。我現(xiàn)在用正則表達(dá)式和strip_tags的配合,并不能把所有的都去掉。
把
以下為引用的內(nèi)容: $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file")); |
改為
以下為引用的內(nèi)容: $data=fread(fopen("$dir/$file","r"),filesize("$dir/$file")); |
3、標(biāo)題上加鏈接
以下為引用的內(nèi)容: foreach($array as $value){ foreach($array as $value){ |
4、防止超時
如果文件比較多,那么防止PHP執(zhí)行時間超時是必要的。可以在文件頭加上
以下為引用的內(nèi)容: set_time_limit(“600”); |
所以完整的程序就是
以下為引用的內(nèi)容: <?php set_time_limit("600"); //獲取搜索關(guān)鍵字 $keyword=trim($_POST["keyword"]); //檢查是否為空 if($keyword==""){ echo"您要搜索的關(guān)鍵字不能為空"; exit;//結(jié)束程序 } 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="沒有標(biāo)題"; } $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> "; } ?> |
到此為止,你已經(jīng)做好了自己的一個搜索引擎,你也可以通過修改內(nèi)容處理部分來改進(jìn)它,可以實(shí)現(xiàn)搜索標(biāo)題,或者搜索內(nèi)容的功能。也可以考慮分頁。這些都留給你自己吧。
這里說明一下用preg_match代替eregi,會快很多。這里只是為了通俗易懂,所以使用了常用的eregi。
分享:PHP關(guān)于代碼轉(zhuǎn)換問題比較完善的解決辦法最近在寫bbs中,遇上代碼轉(zhuǎn)換問題。尋找了很久,才得到一個比較完善的解決辦法,可以徹底還原發(fā)文者的原文。 以下貼出,供大家指正。 系統(tǒng):linux php4 oracle8i
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時間
- PHP中獎概率的抽獎算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-用PHP程序?yàn)樽约壕W(wǎng)站打造一個搜索引擎。