_________________________________________________________ 五、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($fp, 4096)) { if(!xml_parse($parser, $data, feof($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($parser, XML_OPTION_CASE_FOLDING, 0);
$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($fp, 4096)) { if(!xml_parse($parser, $data, feof($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($parser, XML_OPTION_CASE_FOLDING, 0);
$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> |