8

私はこのコードを使用して検索キーワードを強調しています:

function highlightWords($string, $word)
 {

        $string = str_replace($word, "<span class='highlight'>".$word."</span>", $string);
    /*** return the highlighted string ***/
    return $string;

 }

 ....

  $cQuote =  highlightWords(htmlspecialchars($row['cQuotes']), $search_result);

ただし、これは1つのキーワードのみを強調表示します。ユーザーが複数のキーワードを入力すると、検索は絞り込まれますが、単語は強調表示されません。複数の単語を強調表示するにはどうすればよいですか?

4

8 に答える 8

27

正規表現は行く方法です!

function highlight($text, $words) {
    preg_match_all('~\w+~', $words, $m);
    if(!$m)
        return $text;
    $re = '~\\b(' . implode('|', $m[0]) . ')\\b~';
    return preg_replace($re, '<b>$0</b>', $text);
}

$text = '
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat.
';

$words = 'ipsum labore';

print highlight($text, $words);

大文字と小文字を区別しない方法で一致させるには、正規表現に「i」を追加します

    $re = '~\\b(' . implode('|', $m[0]) . ')\\b~i';

注意:「ä」のような非英語の文字の場合、結果はロケールによって異なる場合があります。

于 2010-05-03T11:14:54.140 に答える
17

PHP> 5.3.0、preg_filter()を試してください

/**
 * Highlighting matching string
 * @param   string  $text           subject
 * @param   string  $words          search string
 * @return  string  highlighted text
 */
public function highlight($text, $words) {
    $highlighted = preg_filter('/' . preg_quote($words, '/') . '/i', '<b><span class="search-highlight">$0</span></b>', $text);
    if (!empty($highlighted)) {
        $text = $highlighted;
    }
    return $text;
}
于 2015-04-24T05:47:52.497 に答える
6

単語がスペースで区切られた文字列として入力されていると仮定すると、explodeを使用できます。

$words = explode(' ', $term);

複数のスペースがないことを確認したい場合は、最初に文字列からスペースを削除することをお勧めします

$term = preg_replace('/\s+/', ' ', trim($term));
$words = explode(' ', $term);

次に、置換アレイを生成する必要があります

$highlighted = array();
foreach ( $words as $word ){
    $highlighted[] = "<span class='highlight'>".$word."</span>"
}

それで

str_replace($words, $highlighted, $string);

一緒に置く

function highlightWords($string, $term){
    $term = preg_replace('/\s+/', ' ', trim($term));
    $words = explode(' ', $term);

    $highlighted = array();
    foreach ( $words as $word ){
        $highlighted[] = "<span class='highlight'>".$word."</span>"
    }

    return str_replace($words, $highlighted, $string);
}
于 2010-05-03T11:14:01.793 に答える
5

ウムラウトを含む検索で複数のキーワードを強調表示する

以前に作成した正規表現を使用して、に置き換え\wました[A-Za-z0-9_äöüÄÖÜ]。ご覧のとおり、umlautsを追加しましたäöüÄÖÜ\bまた、検索語のどのような外観にも一致するように削除しました。

検索語:
Suシャンプ

テキスト:
サンシャイニーシャンプー

結果:
Su n shiny shamp oo


私が使用したコード:

private function getSearchTermToBold($text, $words)
{
    preg_match_all('~[A-Za-z0-9_äöüÄÖÜ]+~', $words, $m);
    if (!$m)
        return $text;
    $re = '~(' . implode('|', $m[0]) . ')~i';
    return preg_replace($re, '<b>$0</b>', $text);
}
于 2016-07-13T08:49:31.833 に答える
4

これは、一致するテキストのみを強調表示する簡単な関数です。

function highlighter_text($text, $words)
{
    $split_words = explode( " " , $words );
    foreach($split_words as $word)
    {
        $color = "#e5e5e5";
        $text = preg_replace("|($word)|Ui" ,
            "<span style=\"background:".$color.";\"><b>$1</b></span>" , $text );
    }
    return $text;
}

関数を呼び出す

于 2012-08-07T12:25:57.417 に答える
1

user187291によって提案されているように、テキストを黄色の背景で強調表示するには、次のコードを変更するだけです。

 return preg_replace($re, '<SPAN style="BACKGROUND-COLOR: #ffff00"><b>$0</b></SPAN>', $text); 
于 2012-07-23T04:58:12.663 に答える
0

検索クエリを単語に分割し、各単語を個別に強調表示します。

ただし、JavaScriptで強調表示を実行する方がうまくいく可能性があります。jQueryの「contains」セレクターは、マークアップ要素を置き換える際の問題を回避するのに役立つでしょう...

http://api.jquery.com/contains-selector/

于 2010-05-03T11:13:10.953 に答える
0

他のソリューションでは、強調表示の用語を見つける際に大文字と小文字を区別しない場合がありますが、元の文字列の大文字と小文字は保持されません。したがって、「st」を検索すると「ST」が見つかりますが、検索語である「st」として強調表示されます。

私は以下を使用します。最初に置換配列を形成し、次に配列パラメーターでstr_replace()を使用します。これにより再帰が回避されます。

function highlightStr($haystack, $needle, $highlightStyle) {

    if (strlen($highlightStyle) < 1 || strlen($haystack) < 1 || strlen($needle) < 1) {
       return $haystack;
    }

    preg_match_all("/$needle+/i", $haystack, $matches);

    $matches[0] = array_unique($matches[0]);

    if (is_array($matches[0]) && count($matches[0]) >= 1) {
        foreach ($matches[0] as $ii=>$match)
            $replace[$ii]="<span style='$highlightStyle'>$match</span>";

        $haystack = str_replace($matches[0], $replace, $haystack);
    }

    return $haystack;
}
于 2015-01-17T02:03:49.840 に答える