» home

複数の検索語をハイライトしたいときの簡単なPHPのコード

IT系ニュース専用検索エンジンでは多くの検索エンジンと同じように、検索結果中の検索語を太字にして強調表示しています。複数のキーワードを指定されたとき、ちゃんとそれぞれ強調表示されるようにするにはちょっと工夫がいりました。

preg_replace("'($query)'i", "<strong>$1</strong>", $buf);

ベースになるのはこの正規表現。

function replace_search_result($query, $str)
{
    $query  = str_replace(' ', ' ', $query);
    $q = preg_split("'[\\s,]+'", $query, -1, PREG_SPLIT_NO_EMPTY);
    $qq = array();
    foreach ($q as $val) {
        $qq[] = "'(".preg_quote($val).")'i";
    }
    return preg_replace($qq, "<strong>$1</strong>", $str);
}

第1引数に検索語、第2引数に検索結果をそれぞれ文字列で与えて、強調表示された文字列を返します。

検索語に複数の単語を指定する際には全角スペース、半角スペース、カンマが使われることを想定しています。あらかじめstr_replaceで全角スペースを半角スペースに変換しているのはpreg_splitで文字化けないため。

mb_regex_encoding('UTF-8');
$q = mb_split("\\s| ", $query);

str_replaceとpreg_splitの行を上記のようにしても動きます。速度的にはほとんど変わらなかったので好みでしょう。

preg_replaceの第1引数に配列で渡していますが、これはforeachでpreg_replaceを呼び出すよりやや速いため。$qの値を正規表現の書式に直す処理はarray_mapやarray_walkでやるよりforeachで回した方が速かったです。

WordPressの検索語をハイライトするプラグインやPukiWikiのplugin/search.inc.phpも参考にしました。WordPressの方はHTMLの混じった文字列を置換するので少々複雑。PukiWikiは全角スペースでの区切りに未対応。

By: funaki | 2006年5月1日 | いじる | Trackback | Comments [RSS 2.0]

コメントはまだありません。 »

RSS feed for comments on this post. TrackBack URI

コメントはお気軽にどうぞ

↑top