所有頁面都是靜態的Html,如何實現站內搜索呢?首先介紹一下本文的思路,可能誰有更好的,但注意這只是一個方法問題 :遍歷所有文件 , 讀取內容 ,搜索關鍵字,如果匹配就放入一個數組 , 讀數組。在實現這些步驟之前,這裡假定你的網頁都是標准的,就是有標題(<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.