Php简单站内搜索代码
一,设计搜索表单
在网站的根目录下建个search.htm 内容如下
<ht ml>
<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 typ e="text"name="keyword">
</td>
<td width="64%">
<input typ e="sub mit"name="S ub mit"value="搜索">
</td>
</tr>
</table>
</form>
</body>
</html>
二搜索程序
再在根目录下建个search.php的文件用来处理search.htm表单传过来的数据.内容如下<?p hp
//获取搜索关键字
$keyword=trim($_PO S T[“keyword”]);
//检查是否为空i f($keyword==””){echo”您要搜索的关键字不能为空” ;exit;//结束程序
}
?>
这样如果访问者输入的关键字为空时可以做出提示。下面是遍历所有文件。
我们可以用递归的方法遍历所有的文件可以用函数opendir,readdir,也可以用PHP Directory的类。我们现在用前者.
<?p hp
//遍历所有文件的函数function listFiles($dir){
$handl e=op endir($dir);
while(false!==($file=readdir($handle))){if($file!="."&&$file!=". ."){
//如果是目录就继续搜索if(is_dir("$dir/$file")){li stFil e s("$dir/$fil e");
}else{
//在这里进行处理
}
}
}
}
?>
在红字的地方我们可以对搜索到的文件进行读取处理.下面就是读取文件内容并检查内容中是否含有关键字$keyw or d,如果含有就把文件地址赋给一个数组。
<?p hp
//$dir是搜索的目录,$keyword是搜索的关键字,$array是存放的数组function listFiles($dir,$keyword,&$array){
$handl e=op endir($dir);while(false!==($file=readdir($handle))){if($file!="."&&$file!=". ."){if(is_dir("$dir/$file")){listFil e s("$dir/$fil e",$keyword,$array);
}else{
//读取文件内容
$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
//不搜索自身if($file!=”s earch.php”){
//是否匹配if(ere gi("$keyword",$data)){
$array[]="$dir/$fil e";
}
}
}
}
}
}
//定义数组$arr ay
$array=array();
//执行函数l i stF i l e s(".","php",$array);
//打印搜索结果foreach($array as$value){echo"$value"."<br>\n";
}
?>
现在把这个结果和开头的一段程序结合起来输入一个关键字然后就会发现你的网站中的相关结果都被搜索出来了。我们现在在把它完善一下。
1,列出内容的标题
把if(ere gi("$keyword",$data)){
$array[]="$dir/$fil e";
}
改成if(ere gi("$keyword",$data)){if(eregi("<title>(.+)</title>",$data,$m)){
$title=$m["1"];
}else{
$title="没有标题";
}
$array[]="$dir/$file$title";
}
原理就是如果在文件内容中找到<title>xxx</title>那么就把xxx取出来作为标题如果找不到那么就把标题命名未”没有标题” .
2,只搜索网页的内容的主题部分。
做网页时一定会有很多ht ml代码在里面而这些都不是我们想要搜索的所以要去除它们。我现在用正则表达式和strip_tags的配合,并不能把所有的都去掉。
把
$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));
//不搜索自身if($file!=”s earch.php”){
//是否匹配if(ere gi("$keyword",$data)){
改为
$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));i f(ere gi("<b ody([^>]+)>(.+)</b ody>",$data,$b)){
$body=strip_tags($b["2"]);
}else{
$body=strip_tags($data);
}if($file!="search.php"){
i f(ere gi("$keyword",$b o dy)){
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执行时间超时是必要的。可以在文件头加上s et_time_limit(“600”);
以秒为单位所以上面是设10分钟为限。 软件开发网www.mscto.com所以完整的程序就是
<?p hps et_time_limit("600");
//获取搜索关键字
$keyword=trim($_PO S T["keyword"]);
//检查是否为空i f($keyword==""){echo"您要搜索的关键字不能为空";exit;//结束程序
}function listFiles($dir,$keyword,&$array){
$handl e=op endir($dir);while(false!==($file=readdir($handle))){if($file!="."&&$file!=". ."){if(is_dir("$dir/$file")){listFil e s("$dir/$fil e",$keyword,$array);
}else{
$data=fread(fopen("$dir/$file","r"),filesize("$dir/$file"));i f(ere gi("<b ody([^>]+)>(.+)</b ody>",$data,$b)){
$body=strip_tags($b["2"]);
}else{
$body=strip_tags($data);
}if($file!="search.php"){i f(ere gi("$keyword",$b o dy)){if(eregi("<title>(.+)</title>",$data,$m)){
}else{
$title="没有标题";
}
$array[]="$dir/$file$title";
}
}
}
}
}
}
$array=array();listFil es(".","$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.
百纵科技:美国高防服务器,洛杉矶C3机房 独家接入zenlayer清洗 带金盾硬防,CPU全系列E52670、E52680v3 DDR4内存 三星固态盘阵列!带宽接入了cn2/bgp线路,速度快,无需备案,非常适合国内外用户群体的外贸、搭建网站等用途。官方网站:https://www.baizon.cnC3机房,双程CN2线路,默认200G高防,3+1(高防IP),不限流量,季付送带宽美国洛杉矶C...
前天,还有在"Hostodo商家提供两款大流量美国VPS主机 可选拉斯维加斯和迈阿密"文章中提到有提供两款流量较大的套餐,这里今天看到有发布四款庆祝独立日的七月份的活动,最低年付VPS主机13.99美元,如果有需要年付便宜VPS主机的可以选择商家。目前,Hostodo机房可选拉斯维加斯和迈阿密两个数据中心,且都是基于KVM虚拟+NVMe整列,年付送DirectAdmin授权,需要发工单申请。(如何...
HostKvm也发布了开年促销方案,针对香港国际和美国洛杉矶两个机房的VPS主机提供7折优惠码,其他机房业务提供8折优惠码。商家成立于2013年,提供基于KVM架构的VPS主机,可选数据中心包括日本、新加坡、韩国、美国、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。下面列出几款主机配置信息。美国洛杉矶套餐:美国 US-Plan1CPU:1core内存:2GB硬盘...