• ベストアンサー

文字検索

22歳。新人PGです。 さっそく質問させていただきます。 入力された文字を元に、CSVファイルの中の文章に含まれるものを 検索し、表示するという機能を作成してるんですが、 半角カタカナを入力された場合、意としない文字まで検索に ひっかかってしまします。 ≫CSVファイルの中身 123,あああいいいいうう 124,あああああおおおおお 125,ぽぽぽいいいいえええ ・ ・ ・ ex. 「カレー」と半角カタカナで入力すると、 「カレー」という文字が含まれる文章は検索でひっかかりますが、 「学生レーサー」というものまでもひっかかってしまいます。 文字コードが関係しているのでしょうか? 何か良い解決方法があればお願い致します。 ちなみに、CSVファイル及びPHPソースファイルは全てSJISで、 preg_match("/入力値/",$sentence)で検索しています。

  • PHP
  • 回答数3
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

マルチバイト文字列のマッチ処理には、mb_strpos や mb_ereg を使用してください。 全角カナやEUCに変換しても、問題は解決しません。 全角文字(SJIS)でダメな例: preg_match("/賜/", "虫虫"); EUCでダメな例: preg_match("/鄰/", "虫虫");

その他の回答 (2)

  • NINJA104
  • ベストアンサー率43% (133/306)
回答No.2

CSVファイルから読み込んだレコードと入力された文字列の両方を一旦EUCに変換してからpreg_match()を行なってみてください。 大抵はそれだけでイケると思います。 SHIFT_JISのまま行なうと質問者様の様な意図しない結果が発生します。

noname#22928
noname#22928
回答No.1

自分は元から半角カナが信用ならないので、全角に変換して保存し検索時も半角を全角に変換してから検索とかにしています。

関連するQ&A

  • PHP検索 完全一致のみヒット

    詳しくないので質問内容におかしな点が多々あるかと思いますが・・ サイト内検索でcsvファイルから文字列を呼び出し一致した文字列を出力するというスクリプトで 完全に一致した文字列だけ出力させたいのですが、 たとえばcsvに「AAA」「ABC」「ARZ」のデータがあり 「A」で検索しても何も出力されず、「AAA」と検索した時だけ「AAA」だけを出力したいのですが 「A」で検索すると「A」から始まる全ての文字列(↑で挙げた文字列全て)が出力されてしまって困っています。 どの部分を変えると完全に一致した文字列だけを検索できるようになるのか指摘してくださればと思います。 <?php function funcSiteLink($str, $pass, $csvFileName){ if($str){ $keyword = mb_convert_kana($str, "s","SJIS"); $arr_keyword = preg_split('/[\s]+/', $keyword, -1, PREG_SPLIT_NO_EMPTY); $file = fopen($csvFileName,"r"); $i = 0; while(!feof($file)){ $csv = fgets($file); $str = explode(",", $csv); $keywordPassArr[$i] = $str; $i++; } $judg = 0; foreach($arr_keyword as $val){ foreach($keywordPassArr as $kpa){ preg_match("/$val/", $kpa[0], $matches, PREG_OFFSET_CAPTURE); if($matches[0][1] === 0){ echo '<p><a href="'.$pass .$kpa[1] .'">' .$kpa[0] .'</a></p>'; $judg++; } } } if($judg === 0){ echo "<p>一致しません</p>"; } fclose($file); }else{ echo "<p>一致しません</p>"; } } ?>

    • ベストアンサー
    • PHP
  • ワードで数字以外の半角文字を検索し、全角に置換したい

    ワード2003です。 30Pの文書にカタカナの文字が多数あり、半角と全角が入り混じっています。また、数字も、半角で入力されています。 その中から カタカナの半角文字だけを検索し、全角に置換したいのですができますか どなたか教えてください。

  • PHPの正規表現 メール受信と文字コードについて

    Yahooのメールサーバに接続しメールを取得、メール本文に特定の語句が含まれているか調べたいのですが、うまく行かず悩んでいます。 SJIS文字コードが原因なんでしょうか? かなり長い文章になるので、お暇でしたらご教授下さい。 PHP Version 5.2.5です。 以下のプログラムでの問題点です。 <?php $mb=imap_open("{pop.mail.yahoo.co.jp:110/pop3}INBOX","ID","pass") or die("メールボックスを開けません<br>"); $i=4;//メール番号 //imap_fetchbody、mb_convert_encodingで取得した変数<$body_sjis>と比較する為、メール本文を変数<$mail_honbun>としてファイル内に定義。 $mail_honbun="次のことはを感じで、書きなさい。(すべて)手へんの漢字です。 「正解」はこのあとすぐ。仕上げの湾カールが決まるのは:エッセンシャルダメージケア新発売"; $body=imap_fetchbody($mb,$i,1,FT_PEEK);//本文取得 $body_sjis=mb_convert_encoding($body,"SJIS","auto");//SJISに変換 echo("$body_sjis<br><br><br>"); echo("[mail_honbunの場合]<br>"); if(preg_match("/次の.+書きなさい。/",$mail_honbun,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/次の.+正解/",$mail_honbun,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/エッセンシャル/",$mail_honbun,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/ダメージ/",$mail_honbun,$temp))//NG 何故ダメージはマッチしない? echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); echo("---------------------------------------<br>"); echo("[body_sjisの場合]<br>"); if(preg_match("/次の.+書きなさい。/",$body_sjis,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/書き.+正解/",$body_sjis,$temp))//NG 。を超えるとマッチしない echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/エッセンシャル/",$body_sjis,$temp))//OK エッセンシャルはOK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/ダメージ/",$body_sjis,$temp))//NG ダメージがNG、何故? echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); ?> ## 結果 ######################################################## [mail_honbunの場合] 次のことはを感じで、書きなさい。 次のことはを感じで、書きなさい。(すべて)手へんの漢字です。 「正解 エッセンシャル NOT MATCH --------------------------------------- [body_sjisの場合] 次のことはを感じで、書きなさい。 NOT MATCH エッセンシャル NOT MATCH ################################################################# 問題点<$mail_honbun>の場合 マッチするカタカナと、しないカタカナがある事。(エッセンシャルがマッチして、ダメージがマッチしない事) 問題点<$body_sjis>の場合 。を超えるとマッチしない事。 マッチするカタカナと、しないカタカナがある事。(エッセンシャルがマッチして、ダメージがマッチしない事) 自分で何が問題なのか、何を知らないのかがはっきりしません。 文字コードSJISを使わない方がいいのでしょうか? 参考になる事や、調べたら解決しそうなキーワードがあれば教えて下さい。宜しくお願いします。 ファイル"php.ini"の設定 mbstring.language = Japanese mbstring.internal_encoding = SJIS mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII

    • ベストアンサー
    • PHP
  • 検索しようとしたら、文字が化ける・・・??

    このサイトの検索欄に、ある文字(漢字)を入れて 検索をクリックすると、文字化けを起こして検索 できません。(>_<) 半角カタカナとか、難しい漢字の羅列に置き換わって しまうのです。 以前は、このような事はありませんでした。 また、現在でも違う漢字でしたら、その通り 検索できます。 一体何がおかしいのでしょうか? どこが、おかしいのでしょうか? 宜しくお願い致します。m(__)m

  • MySQLで半角濁音文字の検索

    宜しくお願い致します。 MySQLのselect検索時にフリーワード検索をしています。 DB上には半角・全角文字が混在しており、検索窓に入力した文字の全角・半角を区別せずに検索しております。 文字コードがUTF-8なので、SQL文のwhere区で「collate utf8_unicode_ci」を指定して全角・半角の区別無しで検索しております。 しかし、半角濁音文字、たとえば「ベルト」や「パワー」等の文字列がDB上に半角カタカナで入っている場合に検索窓に全角で入力しても検索できません。 原因はDB上では半角の「ヘ」と「濁音記号」として認識しており、検索窓に入れた文字列は、そのまま「ベ」という1文字として認識しているので検索できないと思われます。 この問題を解決する方法が無くて悩んでおります。 どなたかご教授の程、宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • 英気表現:英字でエラーにしたいのにカナ文字もひっかかります。

    こんにちは。 いつもお世話になっております。 簡単な正規表現で行き詰っており、検索したり参考書を読んだりしたのですが 解決できず、途方に暮れております。 どうか、ご指導よろしくお願い申し上げます。 英字が含まれていたらエラーを返したいだけなのですが 全角カナ文字の場合でも、エラーになってしまいます。 /* 「仮名」を全て「全角カタカナ」に変換 */ $namekana = mb_convert_kana($namekana, "KVC"); /* 「半角カタカナ」を「全角カタカナ」に変換し、「全角」英数字を「半角」*/ $namekana = mb_convert_kana($namekana, "KVa"); if( preg_match("/[a-zA-Z]/", $namekana ) ) { print "<font color=\"red\">カナに英字が混じっています。カナは全角カナで入力して下さい".$namekana."</font><br>"; } どこがおかしいのか、判らないのです。 どうかご指導よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • "【"と"】"でサンドされたキーワードを検索したい

    PHPでpreg_matchをつかい、"【"と"】"でサンドされたキーワードを検索したいです。 たとえば以下のパターンがあるとします。 1.【拡散希望】 2.【これ拡散】 3.【拡散してね】 4.【また拡散よろしく】 5.【お願い】拡散 この場合、"【"と"】"と"拡散"をpreg_matchでさがせばすべて検出できますが、 (こんな感じ)---------------------------------------- if(preg_match('/【/', $value->text) && preg_match('/拡散/', $value->text) && preg_match('/】/', $value->text) ) ------------------------------------------------------- 5番のパターンは条件からはずして1~4の場合のようにサンドされたものだけマッチングさせたいんです。 拡散というワードの前後は不特定なので【】内に拡散と文字が入った場合のパターンを検出する書き方はないでしょうか? ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • preg_matchによるカタカナチェックについて

    preg_matchによるカタカナチェックについて 宜しくお願い致します。 PHPのバージョン:4.4.1 文字コード:euc-jp preg_matchでカタカナのみ入力されているかをチェックしたいと思っております。 下記の様な感じで作ったのですが、ひらがなもスルーになってしまいます。 //会社名【カナ】の適合チェック if(preg_match("/[^ァ-ヶー]+/",$hoge_kana)) { print "カタカナ以外が含まれます"; } どうすればカタカナ以外が含まれた場合にチェックできるのでしょうか?

    • ベストアンサー
    • PHP
  • VBで出力したCSVファイルの文字化けについて。

    VBで複数のCSVファイルから必要なデータのみを 新たなCSVファイルに出力するアプリケーションを作成しています。 処理自体は出力ファイルの作成まできちんとできるのですが、 エクセルで開くと文字化けが起きてしまいます。 文字化けが起きるのは漢字と片仮名(全角、半角両方)です。 ちなみにNotepadで開くと文字化けは起きていませんでした。 また、エクセルのほかにwordpadで開いても文字化けが起きていました。 入力用のCSVファイルの文字コードは分かっていません。 ファイルの読み込みはGetEncoding("Shift_JIS")で読み込んでいます。 文字化けに関する質問は他にも多数あり重複しているかもしれませんが 宜しくお願いします。

  • PHPで文字を検索して取り込みたい。

    PHPで文字を検索して取り込みたい。 %の文字が、何度か出現するソースなのですが そのソースの中にある50%のような全角で%の数値を 取り込みたいのです。 //////ソース//////// <table> <TR> <TD>あ</TD> <TD><B>88%</B>/TD> </TR> <TR> <TD>す</TD> <TD><B>85%</B>/TD> </TR> ........... </table> /////////////////////// 下記のように実行しましたが 思うような結果は得られません。 <?php $str = file_get_contents('http://123456/index.html'); if (preg_match('!<table>\s*?(.*?)</table>!s', $str, $res)) $text = mb_convert_encoding($res[1],"shift-jis","UTF-8");preg_match_all("/-*[0-9]+/",str_replace(",","",$text),$matches); print ($matches[0][0]); ////////////////////////////// php初心者です。 よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう