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.
棉花云官网棉花云隶属于江西乐网科技有限公司,前身是2014年就运营的2014IDC,专注海外线路已有7年有余,是国内较早从事海外专线的互联网基础服务提供商。公司专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,并引导云计算在国内普及。目前公司研发以及运营云服务基础设施服务平台(IaaS),面向全球客户提供基于云计算的IT解决方案与客户服务(SaaS),拥有丰富的国内BGP、双线高防...
HostYun 商家以前是玩具主机商,这两年好像发展还挺迅速的,有点在要做点事情的味道。在前面也有多次介绍到HostYun商家新增的多款机房方案,价格相对还是比较便宜的。到目前为止,我们可以看到商家提供的VPS主机包括KVM和XEN架构,数据中心可选日本、韩国、香港和美国的多个地区机房,电信双程CN2 GIA线路,香港和日本机房,均为国内直连线路。近期,HostYun上线低价版美国CN2 GIA ...
vollcloud怎么样?vollcloud LLC创立于2020年,是一家以互联网基础业务服务为主的 技术型企业,运营全球数据中心业务。VoLLcloud LLC针对新老用户推出全场年付产品7折促销优惠,共30个,机会难得,所有产品支持3日内无条件退款,同时提供产品免费体验。目前所有产品中,“镇店之宝”产品性价比高,适用大部分用户基础应用,卖的也是最好,同时,在这里感谢新老用户的支持和信任,我们...