用PHP&XML编制迷你搜索引擎(四)

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

__________________________________________________________

xml2.php

<html>
<body>
<style type=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;

class 
Cweb {  //网页
  
var $name;
  var 
$url;
  var 
$memo;
 }
 
class 
Cwebs {
  var 
$items = array(Cweb);
  var 
$count 0;
}

class 
Csub {  //类别
  
var $name;
  var 
$url;
 }
 
class 
Csubs {
  var 
$items = array(Csub);
  var 
$count 0;
}

function 
xml_parse_from_file($parser$file

 if(!
file_exists($file)) 
    die(
"Can’t find file "$file"."); 
 

 if(!(
$fp = @fopen($file"r"))) 
   die(
"Can’t open file "$file"."); 
 
 while(
$data fread($fp4096)) { 
   if(!
xml_parse($parser$datafeof($fp))) 
     return(
false); 
  } 

 
fclose($fp); 
 return(
true); 




function 
start_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;   
  }
}


 }




function 
stop_element($parser$name

global 
$level;

$level -= 1;


function 
data($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;   
  }
 }
}


//main start
global $lev,$num,$PHP_SELF;
global 
$title,$webs,$subs;
$level = -1;
$hide TRUE;
$webs = new Cwebs;
$subs = new Csubs;

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($parserXML_OPTION_CASE_FOLDING0); 

$ret xml_parse_from_file($parser$file); 
if(!
$ret

die(
sprintf("XML error: %s at line %d"
xml_error_string(xml_get_error_code($parser)), 
xml_get_current_line_number($parser))); 


xml_parser_free($parser); 


echo 
"<p><a href=$PHP_SELF>搜索首页</a> ";
echo 
"<a href="javascript:history.back()">后退</a><form action="xml3.php" method="get">".
     
"<input name="search" type=edit><input type=submit value="Search"></form></p>";
echo 
"<center><div class=title>".$title."</div></center>";
$i=0;
echo 
"<table width="740">";
while(
$i<$subs->count){
  
$i+=1;
  if((
$i%5)==1)echo"<tr>";
  echo 
"<td width = 20%>";
  echo 
"<a href=".$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)."/";
  echo 
Ceil($webs->count/$pagecount);}
echo 
"<table width=740>";
while(
$i<$webs->count&&$i<(($page+1)*$pagecount)){
  
$i+=1;
  echo 
"<tr>";
  echo 
"<td width=40>".$i."<td width=700><a href=".$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 "<a href="."$PHP_SELF?lev=$lev&num=$num&page=".($page-1).">上一页</a> ";
   if((
$page+1)<Ceil($webs->count/$pagecount))echo "<a href="."$PHP_SELF?lev=$lev&num=$num&page=".($page+1).">下一页</a>";
}
?> 
</body>
</html>

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

<html>
<body>
<style type=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;

class 
Cweb {  //网页
  
var $name;
  var 
$url;
  var 
$memo;
 }
 
class 
Cwebs {
  var 
$items = array(Cweb);
  var 
$count 0;
}

class 
Csub {  //类别
  
var $name;
  var 
$url;
 }
 
class 
Csubs {
  var 
$items = array(Csub);
  var 
$count 0;
}

// 解析XML文件的函数
function xml_parse_from_file($parser$file

 if(!
file_exists($file)) 
    die(
"Can’t find file "$file"."); 
 

 if(!(
$fp = @fopen($file"r"))) 
   die(
"Can’t open file "$file"."); 
 
 while(
$data fread($fp4096)) { 
   if(!
xml_parse($parser$datafeof($fp))) 
     return(
false); 
  } 

 
fclose($fp); 
 return(
true); 




function 
start_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;   
  }



function 
stop_element($parser$name

global 
$level;

$level -= 1;


function 
data($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;   
  }
 }
}


//main start
global $PHP_SELF;
global 
$search,$webs,$subs;
$level = -1;
$hide TRUE;
$webs = new Cwebs;
$subs = new Csubs;

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($parserXML_OPTION_CASE_FOLDING0); 

$ret xml_parse_from_file($parser$file); 
if(!
$ret

die(
sprintf("XML error: %s at line %d"
xml_error_string(xml_get_error_code($parser)), 
xml_get_current_line_number($parser))); 


xml_parser_free($parser); 

// 输出

echo "<p><a href=xml2.php>搜索首页</a> ";
echo 
"<a href="javascript:history.back()">后退</a></p>";
echo 
"<center><div class=title>".$search."</div></center>";
$i=0;
echo 
"<table width="740">";
while(
$i<$subs->count){
  
$i+=1;
  if((
$i%5)==1)echo"<tr>";
  echo 
"<td width = 20%>";
  echo 
"<a href=".$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)."/";
  echo 
Ceil($webs->count/$pagecount);}
echo 
"<table width=740>";
while(
$i<$webs->count&&$i<(($page+1)*$pagecount)){
  
$i+=1;
  echo 
"<tr>";
  echo 
"<td width=40>".$i."<td width=700><a href=".$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 "<a href="."$PHP_SELF?search=$search&page=".($page-1).">上一页</a> ";
   if((
$page+1)<Ceil($webs->count/$pagecount))echo "<a href="."$PHP_SELF?search=$search&page=".($page+1).">下一页</a>";
}
?> 
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值