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.
horain怎么样?horain cloud是一家2019年成立的国人主机商家,隶属于北京辰帆科技有限公司,horain持有增值电信业务经营许可证(B1-20203595),与中国电信天翼云、腾讯云、华为云、UCloud、AWS等签署渠道合作协议,主要提企业和个人提供云服务器,目前商家推出了几款特价物理机,都是在内地,性价比不错,其中有目前性能比较强悍的AMD+NVMe系列。点击进入:horain...
企鹅小屋怎么样?企鹅小屋最近针对自己的美国cn2 gia套餐推出了2个优惠码:月付7折和年付6折,独享CPU,100%性能,三网回程CN2 GIA网络,100Mbps峰值带宽,用完优惠码1G内存套餐是年付240元,线路方面三网回程CN2 GIA。如果新购IP不能正常使用,请在开通时间60分钟内工单VPS技术部门更换正常IP;特价主机不支持退款。点击进入:企鹅小屋官网地址企鹅小屋优惠码:年付6折优惠...
古德云(goodkvm)怎么样?古德云是一家成立于2020年的商家,原名(锤子云),古德云主要出售VPS服务器、独立服务器。古德云主打产品是香港cn2弹性云及美西cn2云服务器,采用的是kvm虚拟化构架,硬盘Raid10。目前,古德云香港沙田cn2机房及美国五星级机房云服务器,2核2G,40G系统盘+50G数据盘,仅35元/月起,性价比较高,可以入手!点击进入:古德云goodkvm官方网站地址古德...