キーワードにマッチした部分をハイライト表示する

任意の文字列のうち、(複数の)キーワードにマッチする部分をstrongタグで囲むサンプルです。
PHP5で動作確認済みです。

このコードはどこかから持ってきたものです(w
関数を紐解いていくと何となく処理が理解できてきます。たぶん。

  • preg_quote関数は特殊文字エスケープ
  • create_function関数は匿名関数を定義できる
  • preg_replace_callbackは、正規表現検索でマッチした文字をコールバック関数に渡すことができる
  • substr関数は、第2引数の位置から第3引数の位置まで文字を切り出すもの

最初にキーワードをpreg_quote関数で特殊文字エスケープ。
あとはキーワードごとに正規表現検索をして、コールバック関数を使用して置換。てなイメージでしょうか。

/**
 * キーワードにマッチした部分をハイライト表示できる形式で返します。
 *
 * @param $arr キーワードが格納された配列
 * @param $str ハイライト変換対象の文字列
 * @return ハイライト化された文字列(strongタグで囲む)
 */
function to_highlight_keyword($arr, $str) {
  if (!$arr || count($arr) < 1) { return $str; }
  foreach ($arr as $val) {
    $val = preg_quote($val, '/');
    $str = preg_replace_callback(
      "/<.*?>|($val)/i",
      create_function('$matches', 
        'return (substr($matches[0], 0, 1) == "<")
                   ? ' . ' $matches[0] 
                   : "<strong>$matches[1]</strong>";'),
        $str
    );
  }
  return $str;
}

正規表現の動作チェックも重要です。私はRubularを使っています。