2011-07-04 71 views
0

我有一個PHP搜索腳本,用於查詢MySQL數據庫,然後通過HTML解析結果以允許CSS樣式。我希望腳本突出顯示用戶搜索結果中的所有關鍵字。我怎樣才能用PHP做到這一點?在PHP搜索腳本中突出顯示關鍵字

我的PHP腳本是:

<?php 

mysql_connect("localhost","username","password"); 
mysql_select_db("database"); 

if(!empty($_GET['q'])){ 
$query=mysql_real_escape_string(trim($_GET['q'])); 
$searchSQL="SELECT * FROM links WHERE `title` LIKE '%{$query}%' LIMIT 8"; 
$searchResult=mysql_query($searchSQL); 

while ($row=mysql_fetch_assoc($searchResult)){ 
    $results[]="<a href='{$row['url']}' class='webresult'><div class='title'>{$row['title']}</div><div class='desc'>{$row['description']}</div><div class='url'>{$row['url']}</div></a>"; 
} 

if(empty($results)){ 
echo 'No results were found'; 
} else { 
echo implode($results); 
} 
} 

?> 

回答

0

簡單化,你可以適應這裏的循環:

$searchvar = trim($_GET['q']); 
while ($row=mysql_fetch_assoc($searchResult)){ 
    $description = str_replace($searchvar, '<span class="highlight">'.$searchvar."</span>", $row['description']); 
    $results .="<a href='{$row['url']}' class='webresult'> 
    <div class='title'>{$row['title']}</div> 
    <div class='desc'>{$description}</div> 
    <div class='url'>{$row['url']}</div></a>"; 
} 

要讓它好一點:

$searchvar = explode(" ", trim($_GET['q'])); //puts each space separated word into the array.  
while ($row=mysql_fetch_assoc($searchResult)){ 
    $description = $row['description']; 
    foreach($searchvar as $var) $description = str_replace($var, '<span class="highlight">'.$var."</span>", $description); 
    $description = str_replace($searchvar, '<span class="highlight">'.$searchvar."</span>", $row['description']); 
    $results .="<a href='{$row['url']}' class='webresult'> 
    <div class='title'>{$row['title']}</div> 
    <div class='desc'>{$description}</div> 
    <div class='url'>{$row['url']}</div></a>"; 
} 

第二個的好處還有,如果在「iPod的toudch黃色用戶類型「你會尋找」ipod「,」toudch「和」黃色「,這將否定這種類型,並使結果更一般化。

您將需要交換單:在SQL

like '%query%' 

foreach(explode(" ", trim($_GET['q']) as $searchvar) $where[] = "like '%$searchvar%'"; 
$wheresql = implode(" OR ", $where); 

讓每個搜索「詞」來看待的,否則您將有一個有限的搜索無關的亮點。

0

您可以使用str_replace。對於用戶使用的每個關鍵字,將其放入$search陣列中,並將其放入$replace陣列中,但在後者中使用span分類標記,您可以稍後使用CSS進行樣式設置。例如:

$search = array('apple', 'orange'); 
$replace = array(); 
foreach ($search as $word) 
{ 
    $replace[] = "<span class='highlight'>$word</span>"; 
} 

$string = str_replace($search, $replace, $string); 

編輯:假設$query只包含由一個空格分隔的關鍵字,你可以得到搜索陣列這種方式(與explode),

$search = explode(' ', $query); 

或者,如果你想添加更復雜的邏輯處理的關鍵字了$query變量(比如,如果你使用的查詢運營商如+),你可以使用一個for循環:

$queryTerms = explode(' ', $query); 
$search = array(); 
foreach ($queryTerms as $term) 
{ 
    // do some processing of the $term (like delete "+"?) 
    // ... 

    $search[] = $processedTerm; 
} 
+0

@Callum你可以使用'for'循環來做到這一點。或者,假設所有用戶只是搜索由空白分隔的單詞,就可以爆炸'$ query'來獲取搜索數組...我會將其編輯到我的答案中。 – 2011-07-04 20:35:14

0

我也發現了這個解決方案要突出每個詞結果:

$text = $searchresults; 
class highlight 
{ 
    public $output_text; 

    function __construct($text, $words) 
    { 
    $split_words = explode(" " , $words); 

    foreach ($split_words as $word) 
    { 
     $text = preg_replace("|($word)|Ui" , "<b>$1</b>" , $text); 
    } 
    $this->output_text = $text; 
    } 
} 
$highlight = new highlight($searchresults, $keywords); 
echo $highlight; 

在情況下,可以幫助,

問候,

最大

0

可以使用正則表達式或簡單地替換以查找特定的字符串並在其周圍添加跨度:

while ($row=mysql_fetch_assoc($searchResult)){ 
    $str ="<a href='".$row['url']."' class='webresult'>"; 
    $str .="<div class='title'>".$row['title']."</div>"; 
    $str .="<div class='desc'>"; 
    $str .= str_replace($query,"<span class='hightlighted'>".$query."</span>",$row['description']); 
    $str .="</div><div class='url'>".$row['url']."</div></a>"; 
    $result[] = $str; 
} 

現在的CSS:

span.highlighted { 
    background-color: yellow; 
}