设为首页 收藏本站
查看: 504|回复: 0

[经验分享] 用PHP&XML编制迷你搜索引擎(四)

[复制链接]

尚未签到

发表于 2017-4-8 12:27:44 | 显示全部楼层 |阅读模式
用PHP&XML编制迷你搜索引擎(四)
_________________________________________________________
五、mini的搜索引擎
作了如干的铺垫,令人激动的时刻到来了。
分页等版式输出和用SQL的搜索引擎差不多,我就不加注释了。
第一段为仿sina,yahoo的按照类别查询
第二段为搜索查询部分(其实就是把整个树遍历一遍)显示符合的
内容。

__________________________________________________________

xml2.php

<html>
<body>
<styletype=text/css>
td,p,li,input,select{font-size:12px;}
A:link{font-size:12px;color:#00007f;}
A:visited{font-size:12px;color:#00007f;}
A:active{font-size:12px;color:#ff0000;}
A:hover{font-size:12px;color:#ff0000;}
.title{font-family:Tahoma;width=420;font-size:16px;font-weight:bold;color:steelblue;filter:Shadow(color="LightGrey",Direction="130");}
.counter{font-family:Tahoma;color=green;font-size:12px;}
</style>
<?
//XML文件
$file="demo.xml";
$pagecount=10;

classCweb{//网页
var$name;
var$url;
var$memo;
}

classCwebs{
var$items=array(Cweb);
var$count=0;
}

classCsub{//类别
var$name;
var$url;
}

classCsubs{
var$items=array(Csub);
var$count=0;
}

functionxml_parse_from_file($parser,$file)
{
if(!file_exists($file))
die("Can’tfindfile"$file".");


if(!($fp=@fopen($file,"r")))
die("Can’topenfile"$file".");

while($data=fread($fp,4096)){
if(!xml_parse($parser,$data,feof($fp)))
return(false);
}

fclose($fp);
return(true);
}



functionstart_element($parser,$name,$attrs)
{
global$show,$level,$levelcount,$maxlevel,$hide,$lev,$num,$PHP_SELF;
global$webs,$subs;
$level+=1;
if($level>$maxlevel)$maxlevel=$level;
$levelcount[$level]+=1;

if($hide){
if($level==$lev&&$levelcount[$level]==$num)$hide=FALSE;
}else{
if($level<=$lev)$hide=TRUE;
}


if(!$hide){
switch($name){
case"sub":
$show="sub";
break;
case"web":
$show="web";
break;
default:

break;
}

if($level==$lev+1&&$level>0){

switch($show){
case"sub":
$subs->count+=1;
$subs->items[$subs->count]->url="$PHP_SELF?lev=$level&num=$levelcount[$level]";
break;
case"web":
$webs->count+=1;
while(list($key,$val)=each($attrs)){
switch(trim($key)){
case"url":
$webs->items[$webs->count]->url=trim($val);
break;
case"memo":
$webs->items[$webs->count]->memo=trim($val);
break;

}
}
break;
default:

break;
}
}


}


}

functionstop_element($parser,$name)
{
global$level;

$level-=1;
}

functiondata($parser,$data)
{
global$level,$hide,$show,$lev,$levelcount,$num;
global$webs,$subs,$title;
if($level==$lev&&$levelcount[$level]==$num&&trim($data)!="")$title=trim($data);
if(!$hide)
if(trim($data)!=""&&($level==$lev+1&&$level>0)){
switch($show){
case"sub":
$subs->items[$subs->count]->name=trim($data);
break;
case"web":
$webs->items[$webs->count]->name=trim($data);
break;
}
}
}


//mainstart
global$lev,$num,$PHP_SELF;
global$title,$webs,$subs;
$level=-1;
$hide=TRUE;
$webs=newCwebs;
$subs=newCsubs;

if($lev==""){$lev=0;$num=1;}
if($page=="")$page=0;

$parser=xml_parser_create();

xml_set_element_handler($parser,"start_element","stop_element");
xml_set_character_data_handler($parser,"data");
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);

$ret=xml_parse_from_file($parser,$file);
if(!$ret)
{
die(sprintf("XMLerror:%satline%d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}

xml_parser_free($parser);


echo"<p><ahref=$PHP_SELF>搜索首页</a> ";
echo"<ahref="javascript:history.back()">后退</a><formaction="xml3.php"method="get">".
"<inputname="search"type=edit><inputtype=submitvalue="Search"></form></p>";
echo"<center><divclass=title>".$title."</div></center>";
$i=0;
echo"<tablewidth="740">";
while($i<$subs->count){
$i+=1;
if(($i%5)==1)echo"<tr>";
echo"<tdwidth=20%>";
echo"<ahref=".$subs->items[$i]->url.">".$subs->items[$i]->name."</a>";
echo"</td>";
}
echo"</table><hr>";

$i=$page*$pagecount;
if($webs->count>0){
echo"<center>".($page+1)."/";
echoCeil($webs->count/$pagecount);}
echo"<tablewidth=740>";
while($i<$webs->count&&$i<(($page+1)*$pagecount)){
$i+=1;
echo"<tr>";
echo"<tdwidth=40>".$i."<tdwidth=700><ahref=".$webs->items[$i]->url.">".
$webs->items[$i]->name."</tr><tr><td/><td>".$webs->items[$i]->memo;
echo"</td></tr>";
}
echo"</table>";
if($webs->count>0){
if($page>0)echo"<ahref="."$PHP_SELF?lev=$lev&num=$num&page=".($page-1).">上一页</a> ";
if(($page+1)<Ceil($webs->count/$pagecount))echo"<ahref="."$PHP_SELF?lev=$lev&num=$num&page=".($page+1).">下一页</a>";
}
?>
</body>
</html>

__________________________________________________________
xml3.php
关键字匹配采用eregi函数,功能相对简单,且有些bug,
如输入C++会报错(因为+是关键字)这点就不如用SQL查询了。
您可以在下面的程序的基础上加以完善,我这个迷你的就
起到抛砖引玉的作用吧。

<html>
<body>
<styletype=text/css>
td,p,li,input,select{font-size:12px;}
A:link{font-size:12px;color:#00007f;}
A:visited{font-size:12px;color:#00007f;}
A:active{font-size:12px;color:#ff0000;}
A:hover{font-size:12px;color:#ff0000;}
.title{font-family:Tahoma;width=420;font-size:16px;font-weight:bold;color:steelblue;filter:Shadow(color="LightGrey",Direction="130");}
.counter{font-family:Tahoma;color=green;font-size:12px;}
</style>
<?
//XML文件
$file="demo.xml";
$pagecount=10;

classCweb{//网页
var$name;
var$url;
var$memo;
}

classCwebs{
var$items=array(Cweb);
var$count=0;
}

classCsub{//类别
var$name;
var$url;
}

classCsubs{
var$items=array(Csub);
var$count=0;
}

//解析XML文件的函数
functionxml_parse_from_file($parser,$file)
{
if(!file_exists($file))
die("Can’tfindfile"$file".");


if(!($fp=@fopen($file,"r")))
die("Can’topenfile"$file".");

while($data=fread($fp,4096)){
if(!xml_parse($parser,$data,feof($fp)))
return(false);
}

fclose($fp);
return(true);
}



functionstart_element($parser,$name,$attrs)
{
global$show,$level,$levelcount,$maxlevel,$PHP_SELF;
global$webs,$subs;
global$search,$finded;
$finded=FALSE;
$level+=1;
if($level>$maxlevel)$maxlevel=$level;
$levelcount[$level]+=1;

switch($name){
case"sub":
$show="sub";
break;
case"web":
$show="web";
break;
default:

break;
}

switch($show){
case"sub":
$subs->count+=1;
$subs->items[$subs->count]->url="xml2.php?lev=$level&num=$levelcount[$level]";
break;
case"web":
$webs->count+=1;
while(list($key,$val)=each($attrs)){
if(eregi($search,$val))$finded=TRUE;

switch(trim($key)){
case"url":
$webs->items[$webs->count]->url=trim($val);
break;
case"memo":
$webs->items[$webs->count]->memo=trim($val);
break;
}
}
break;
default:

break;
}

}

functionstop_element($parser,$name)
{
global$level;

$level-=1;
}

functiondata($parser,$data)
{
global$level,$show,$levelcount;
global$webs,$subs;
global$search,$finded;

if(trim($data)!=""){
switch($show){
case"sub":
$subs->items[$subs->count]->name=trim($data);
if(!eregi($search,$data))$subs->count-=1;
break;
case"web":
$webs->items[$webs->count]->name=trim($data);
if((!eregi($search,$data))&&(!$finded))$webs->count-=1;
break;
}
}
}


//mainstart
global$PHP_SELF;
global$search,$webs,$subs;
$level=-1;
$hide=TRUE;
$webs=newCwebs;
$subs=newCsubs;

if($page=="")$page=0;
if($search=="")$search="请输入关键字";

$parser=xml_parser_create();

xml_set_element_handler($parser,"start_element","stop_element");
xml_set_character_data_handler($parser,"data");
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);

$ret=xml_parse_from_file($parser,$file);
if(!$ret)
{
die(sprintf("XMLerror:%satline%d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}

xml_parser_free($parser);

//输出

echo"<p><ahref=xml2.php>搜索首页</a> ";
echo"<ahref="javascript:history.back()">后退</a></p>";
echo"<center><divclass=title>".$search."</div></center>";
$i=0;
echo"<tablewidth="740">";
while($i<$subs->count){
$i+=1;
if(($i%5)==1)echo"<tr>";
echo"<tdwidth=20%>";
echo"<ahref=".$subs->items[$i]->url.">".$subs->items[$i]->name."</a>";
echo"</td>";
}
echo"</table><hr>";

$i=$page*$pagecount;
if($webs->count>0){
echo"<center>".($page+1)."/";
echoCeil($webs->count/$pagecount);}
echo"<tablewidth=740>";
while($i<$webs->count&&$i<(($page+1)*$pagecount)){
$i+=1;
echo"<tr>";
echo"<tdwidth=40>".$i."<tdwidth=700><ahref=".$webs->items[$i]->url.">".
$webs->items[$i]->name."</tr><tr><td/><td>".$webs->items[$i]->memo;
echo"</td></tr>";
}
echo"</table>";
if($webs->count>0){
if($page>0)echo"<ahref="."$PHP_SELF?search=$search&page=".($page-1).">上一页</a> ";
if(($page+1)<Ceil($webs->count/$pagecount))echo"<ahref="."$PHP_SELF?search=$search&page=".($page+1).">下一页</a>";
}
?>
</body>
</html>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-361968-1-1.html 上篇帖子: PHP中define和defined的区别 下篇帖子: PHP 5.3的新增魔术方法 __invoke
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表