/** * マルチバイト対応でHTML中の検索語句をマーキングする * * @static * @access public * @param string $pattern マッチ文字列。SJISで入ってくる。あらかじめhtmlspecialchars()されていること。 * @param string $targetHtml 置換対象文字列。SJISで入ってくる。HTML。 * @return string HTML */ function filterMarking($pattern, $targetHtml, $marker = '<b class="filtering">\\0</b>') { global $res_filter; if ($res_filter['method'] == 'regex') { $pattern = StrCtl::replaceRegexAnyChar($pattern); } // 全角/半角を(ある程度)区別なくマッチ $pattern = StrCtl::getPatternZenHan($pattern); // 正規表現パターン // HTML要素にマッチさせないための否定先読みパターンを付加 $pattern = $pattern . '(?![^<]*>)'; $result = false; if (P2_MBREGEX_AVAILABLE == 1) { $result = mb_eregi_replace($pattern, $marker, $targetHtml); // Error => FALSE } else { // UTF-8に変換してから処理する $pattern = str_replace('/', '\\/', $pattern); $pattern_utf8 = '/' . mb_convert_encoding($pattern, 'UTF-8', 'SJIS-win') . '/iu'; $target_utf8 = mb_convert_encoding($targetHtml, 'UTF-8', 'SJIS-win'); $result = preg_replace($pattern_utf8, $marker, $target_utf8); $result = mb_convert_encoding($result, 'SJIS-win', 'UTF-8'); } if ($result === false) { return $targetHtml; } return $result; }