精华:支持逻辑OR-AND关键字搜索高亮显示搜索结果的代码
鉴于很多朋友都在找一段支持逻辑and/or的搜索代码,正好小弟写过一段,不敢独享,昨晚特地整理了一下,希望能给大家起到抛砖引玉的效果。
首先建立一个测试用的表,字段如下:
create table test (
id int(11) not null default '0' auto_increment,
title varchar(255) not null,
content text not null,
primary key(id)
);
建好之后随便录入一些数据,到时候搜索用的。程序代码如下:
<?php
/*************************************************************
/ 支持逻辑OR/AND关键字搜索高亮显示搜索结果的代码
/*************************************************************
/ Title........: Search and Highlight Function
/ Begin........: 2002-09-05
/ Author.......: George
/ E-mail.......: phpteam@vip.sina.com
/************************************************************/
/*************************************************************
/ Function........: search_parse($keywords,$fields)
/ Notes...........:
/ ...$keywords....: eg. "a and b or c"
/ ...$fields......: Field's name eg:array("field1","field2")
/ Return..........: Return the SQL
/************************************************************/
function search_parse($keywords,$fields)
{
if ($keywords)
{
$words = explode(" ",$keywords);
for ($i = 0;$i < count( $words ); $i++)
{
if ($words[$i])
{
if (strtolower($words[$i]) == "and" || strtolower($words[$i]) == "or")
{
if ($i > 0)
{
if($words[$i] == "and") $sql.=" AND ";
elseif($words[$i] == "or") $sql.=" OR ";
}
}
else
{
$first=0;
$sql_tmp="( ";
foreach ($fields as $key => $value)
{
if ($first == 0)
{
$sql_tmp.=$value." LIKE '%".$words[$i]."%'";
$first=1;
}
else
{
$sql_tmp.=" OR ".$value." LIKE '%".$words[$i]."%'";
}
}
if(trim($sql_tmp) != "(") $sql_tmp.=" )";
if($i == 0) $sql=$sql_tmp;
else $sql.=$sql_tmp;
}
}
}
}
return $sql;
}
/*************************************************************
/ Function........: highlight_result($str,$keywords)
/ Notes...........:
/ ...$str.........: The String needed to highlight
/ ...$keywords....: eg. "a and b or c"
/ Return..........: Return the Highlighted String
/************************************************************/
function highlight_result($str,$keywords)
{
$words = explode(" ",$keywords);
for ($i=0;$i<count($words);$i++)
{
if(strtolower($words[$i]) == "and" or strtolower($words[$i]) == "or")
continue;
$str=str_replace("$words[$i]","<font color=blue><b>$words[$i]</b></font>",$str);
}
return $str;
}
//Example:
$keywords="一 and 数 or 之";
$fields=array("title","content");
$link = mysql_connect("localhost", "root", "") or die("Could not connect");
mysql_select_db("test",$link) or die("Could not Select the Database!");
$sql=search_parse($keywords,$fields);
echo $sql;
$query="select title from test where $sql";
$result=mysql_query($query) or die("Invalid query:$query");
while($row=mysql_fetch_array($result))
{
echo "<li>".highlight_result($row[title],$keywords)."</li>";
}
mysql_close($link);
?>
以上只是一个简化的版本,请大家多多指教,具体实例请访问我去年写的程序:
http://www.gongan.ningbo.gov.cn/search.php