2011-07-04 5 views
0

私は、MySQLデータベースにクエリを行い、CSSスタイリングを可能にするためにHTMLで結果を解析するPHP検索スクリプトを用意しています。スクリプトで、ユーザーが検索した結果のすべてのキーワードを強調表示します。 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"、 "yellow"を検索します。

あなたは、単一を交換する必要があります:

like '%query%' 

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

で各検索「という単語は、」SQLで探さなければ取得するか、との限定された検索を持つことになります無関係のハイライト

0

あなたはstr_replaceを使用することができます。ユーザーが使用する各キーワードについては、$search配列に入れて、$replace配列に入れますが、後でCSSでスタイルを設定できる後者のクラスspanタグで囲みます。たとえば、次のように

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

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

EDIT:$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

。または、すべてのユーザーが空白で区切られた単語を検索すると仮定すると、 '$ query'を展開して検索配列を得ることができます...それを私の答えに編集します。 –

0

私はまた、結果の単語を強調するために、この解決策を見つけましたregexまたは単にstrを使用して特定の文字列を検索し、文字列の周りにスパンを追加します。

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:あなたがそれを行うには、 `for`ループを使用することができ@Callum

span.highlighted { 
    background-color: yellow; 
} 
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; 

よろしく、

最大:

関連する問題