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.
官方网站:点击访问创梦网络宿迁BGP高防活动方案:机房CPU内存硬盘带宽IP防护流量原价活动价开通方式宿迁BGP4vCPU4G40G+50G20Mbps1个100G不限流量299元/月 209.3元/月点击自助购买成都电信优化线路8vCPU8G40G+50G20Mbps1个100G不限流量399元/月 279.3元/月点击自助购买成都电信优化线路8vCPU16G40G+50G2...
腾讯云轻量应用服务器又要免费升级配置了,之前已经免费升级过一次了(腾讯云轻量应用服务器套餐配置升级 轻量老用户专享免费升配!),这次在上次的基础上再次升级。也许这就是良心云吧,名不虚传。腾讯云怎么样?腾讯云好不好。腾讯云轻量应用服务器 Lighthouse 是一种易于使用和管理、适合承载轻量级业务负载的云服务器,能帮助个人和企业在云端快速构建网站、博客、电商、论坛等各类应用以及开发测试环境,并提供...
官方网站:点击访问酷番云官网活动方案:优惠方案一(限时秒杀专场)有需要海外的可以看看,比较划算29月,建议年付划算,月付续费不同价,这个专区。国内节点可以看看,性能高IO为主, 比较少见。平常一般就100IO 左右。优惠方案二(高防专场)高防专区主要以高防为主,节点有宿迁,绍兴,成都,宁波等,节点挺多,都支持防火墙自助控制。续费同价以下专场。 优惠方案三(精选物理机)西南地区节点比较划算,赠送5...