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.
Hostodo是一家成立于2014年的国外VPS主机商,现在主要提供基于KVM架构的VPS主机,美国三个地区机房:拉斯维加斯、迈阿密和斯波坎,采用NVMe或者SSD磁盘,支持支付宝、PayPal、加密货币等付款方式。商家最近对于上架不久的斯波坎机房SSD硬盘VPS主机提供66折优惠码,适用于1GB或者以上内存套餐年付,最低每年12美元起。下面列出几款套餐配置信息。CPU:1core内存:256MB...
bgpto怎么样?bgp.to日本机房、新加坡机房的独立服务器在搞特价促销,日本独立服务器低至6.5折优惠,新加坡独立服务器低至7.5折优惠,所有优惠都是循环的,终身不涨价。服务器不限制流量,支持升级带宽,免费支持Linux和Windows server中文版(还包括Windows 10). 特色:自动部署,无需人工干预,用户可以在后台自己重装系统、重启、关机等操作!bgpto主打日本(东京、大阪...
CheapWindowsVPS是一家成立于2007年的老牌国外主机商,顾名思义,一个提供便宜的Windows系统VPS主机(同样也支持安装Linux系列的哈)的商家,可选数据中心包括美国洛杉矶、达拉斯、芝加哥、纽约、英国伦敦、法国、新加坡等等,目前商家针对VPS主机推出5折优惠码,优惠后最低4GB内存套餐月付仅4.5美元。下面列出几款VPS主机配置信息。CPU:2cores内存:4GB硬盘:60G...