単語検索で、全角英数字と半角英数字の区別なく検索したい†
- ページ: BugTrack
- 投稿者: reimy
- 優先順位: 普通
- 状態: 完了
- カテゴリー: 本体新機能
- 投稿日: 2003-05-21 (水) 11:32:05
- バージョン:
メッセージ†
単語検索で、大文字と小文字は同一視して検索されるが、全角と半角は区別される。
全角英数字と半角英数字も同一視して検索したい。
- PHP:mb_convert_kanaを使えば何とかなりそうですが。 -- ぱんだ
- 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
- いろいろやってみたけど、うまくいかない -- reimy
- 適当に作ってみました。試してみてください。ついでなのでひらがな/カタカナおよび全角の大文字/小文字も同一視するようにしてあります。 -- ぱんだ
- いただきましたm(__)m。おー、すごく便利になったぁ。 -- reimy
- 半角カタカナでも検索できる。びっくり!! -- reimy
- 「J&」で検索したとき、検索結果で「J& のすべてを含むページは…」と表示されてしまう。 -- reimy
- 「これらのキーワードがハイライトされています: J&」のほうは正常に表示される。 -- reimy
- んー。$pattern内の'&'がエスケープされていませんね。これでどうですか。 -- ぱんだ
--- 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()を通しておくべきですね。 -- ぱんだ
- 変換順序を工夫して、PHP4.3.0以降でしかサポートされていないPHP:mb_convert_caseを使わないようにしてみました。 -- ぱんだ
- あと、SOURCE_ENCODING=='EUC-JP'のときに文字の区切りを間違える*1問題を回避するパターンも入っています。Perlメモのパターンを丸写ししています。 -- ぱんだ
- 【補足】引用符(シングルクォーテーション、ダブルクォーテーション)については、検索時も全角と半角を完全に区別することに注意(PHPのmb_convert_kanaの仕様)。全角では引用符の開き・閉じに区別があるが、半角では区別がないため。 -- reimy
- 同様の理由で、円マークやバックスラッシュも全角と半角が区別されます(半角でコードが重複するため)。 -- reimy