2011-12-15 22 views
4

私のウェブサイトで「Tales of an Ancient Empire」を検索してみましょう。 データベースで全文検索が行われ、結果が表示されます。私はPHPの検索結果のハイライトスクリプト

function sublinhamos($text, $words) { 

    // explode the phrase in words 
    $wordsArray = explode(' ', $words); 

    // loop all searched words 
    foreach($wordsArray as $word) { 
     //highlight 
     $text = str_ireplace($word, "<span class=\"highlight\">".strtoupper($word)."</span>", $text, $count); 
    } 
    //right trows results 
    return $text; 
} 

thngyハイライトのこの機能を持っているそれはあまりにも悪くはないが、さがすの用語は、「古代帝国の物語」、str_ireplaceが見つかったときに、既に挿入SPANのそれが遭遇」であるため、ここでの問題はあります検索語から単語を抽出し、SPANタグを分割します。

単語の一部を強調表示するにはハイライトが必要ですが、最小2文字までのすべての単語を強調表示する必要がありますが、これは古いSPANの出会いの問題を除いてすべて良好です。

どのようなアイデアをお願いしますか?あなただけの簡単な操作を行うことができ、すべてのヒットをマークした後

$text = str_ireplace($word, "{{{".strtoupper($word)."}}}", $text, $count); 

:このようなあなたは代わりがない(。例えば{{{と}}})検索される一時的な文字列に置き換えることができ

答えて

5

まあ、私はスパンを使用しません。

<mark></mark> 

は、使用するのに優れた要素です。このようなテキストの部分をハイライトするのが目的です。詳細については、this articleを参照してください。

また、あなたが例えば、str_replaceに配列を渡すことができます。

function sublinhamos($text, $words) { 
    $wordsArray = array(); 
    $markedWords = array(); 
    // explode the phrase in words 
    $wordsArray = explode(' ', $words); 

    foreach ($wordsArray as $k => $word) { 
     $markedWords[$k]='<mark>'.$word.'</mark>'; 
    } 

    $text = str_ireplace($wordsArray, $markedWords, $text); 

    //right trows results 
    return $text; 
} 
+1

ユーザーが「マーク」を検索する可能性があるため、この問題は解決しない可能性があります。 – mishu

+0

@mishu彼はただ気づいただけです。彼の解決策は、ループではなくアレイをすぐに置き換えることです。私はそれが好きです。 +1 – Flo

+0

それだけでテストした結果、(テスト用に作成された)結果が奇妙で、それにワードマークが付いていて、マークを検索しても出力が壊れていなかったので...これはおそらく... – eduardev

1

あなたのスパンタグに一時的な文字列を置き換えます。

0

をあなたは否定ルック背後の代わりににpreg_replaceを使用することができます。

$text = preg_replace('/(?<!<sp)(?<!<\/sp)(an)/i', '<span class="highlight">$1</span>', $text); 

最初のルックの背後には、開始のためでありますspanタグと終了タグの2番目のタグです。可能であれば、それらを1つに組み合わせることはできますが、わかりません。

0

このような試みをしましたか?

$text = preg_replace("|($word)|", "<span class=\"highlight\">".strtoupper($word)."</span>", $text, $count);