単語検索で、全角英数字と半角英数字の区別なく検索したい

  • ページ: BugTrack
  • 投稿者: reimy
  • 優先順位: 普通
  • 状態: 完了
  • カテゴリー: 本体新機能
  • 投稿日: 2003-05-21 (水) 11:32:05
  • バージョン:

メッセージ

単語検索で、大文字と小文字は同一視して検索されるが、全角と半角は区別される。

全角英数字と半角英数字も同一視して検索したい。


  • PHP:mb_convert_kanaを使えば何とかなりそうですが。 -- ぱんだ 2003-05-21 (水) 12:44:39
    • func.phpのdo_search()ですよねぇ。キー入力側は
         $b_type = ($type == 'AND'); // AND:TRUE OR:FALSE
      +  $word = mb_convert_kana($word,"a");
         $keys = preg_split('/\s+/',preg_quote($word,'/'),-1,PREG_SPLIT_NO_EMPTY);

      でいいと思うんですけど、ソースの読み込み側で半角英文字化するのはどの部分でやればいいんでしょうか。 -- reimy 2003-05-21 (水) 23:33:37

  • いろいろやってみたけど、うまくいかない -- reimy 2003-05-23 (金) 04:03:12
  • 適当に作ってみました。試してみてください。ついでなのでひらがな/カタカナおよび全角の大文字/小文字も同一視するようにしてあります。 -- ぱんだ 2003-05-23 (金) 11:35:29
  • いただきましたm(__)m。おー、すごく便利になったぁ。 -- reimy 2003-05-23 (金) 14:26:00
    • 半角カタカナでも検索できる。びっくり!! -- reimy 2003-05-23 (金) 14:33:42
  • 「J&」で検索したとき、検索結果で「J& のすべてを含むページは…」と表示されてしまう。 -- reimy 2003-05-23 (金) 14:54:04
    • 「これらのキーワードがハイライトされています: J&」のほうは正常に表示される。 -- reimy 2003-05-23 (金) 15:01:22
  • んー。$pattern内の'&'がエスケープされていませんね。これでどうですか。 -- ぱんだ 2003-05-23 (金) 15:36:03
     --- html.php
     +++ html.php.new
     foreach ($keys as $key=>$pattern)
     {
       $s_key = htmlspecialchars($key);
    +  $s_pattern = htmlspecialchars($pattern); // ;(
       $search_word .= " <strong class=\"word$class\">$s_key</strong>";
       $to = "<strong class=\"word$class\">\$1</strong>";
       $body = preg_replace("/(?:^|(?<=>))([^<]*)/e",
    -    'preg_replace("/($pattern)/i",$to,\'$1\')',$body);
    +    'preg_replace("/($s_pattern)/",$to,\'$1\')',$body);
       $class++;
  • キャラクタ'(?:|)'がhtmlspecialchars()で変換されないことを前提にしています。本来はパターンを結合する前にhtmlspecialchars()を通しておくべきですね。 -- ぱんだ 2003-05-23 (金) 15:48:02
    • うまくいきましたm(__)m -- reimy 2003-05-23 (金) 17:03:26
  • 変換順序を工夫して、PHP4.3.0以降でしかサポートされていないPHP:mb_convert_caseを使わないようにしてみました。 -- ぱんだ 2003-05-23 (金) 18:32:42
  • あと、SOURCE_ENCODING=='EUC-JP'のときに文字の区切りを間違える*1問題を回避するパターンも入っています。Perlメモのパターンを丸写ししています。 -- ぱんだ 2003-05-23 (金) 18:34:09
  • 【補足】引用符(シングルクォーテーション、ダブルクォーテーション)については、検索時も全角と半角を完全に区別することに注意(PHPのmb_convert_kanaの仕様)。全角では引用符の開き・閉じに区別があるが、半角では区別がないため。 -- reimy 2003-05-27 (火) 02:10:47
    • 同様の理由で、円マークやバックスラッシュも全角と半角が区別されます(半角でコードが重複するため)。 -- reimy 2003-05-27 (火) 02:14:48

*1 「好」(B9A5)と「スト」(A5B9A5C8), 「壁」(CAC9)と「な表」(A4CAC9BD)など

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2003-05-01 (木) 09:42:11
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.228 sec.

OSDN