• ベストアンサー

フォームの入力値を登録語に置換して表示する方法を教えてください

PHPでフォームに入力された漢字を一字ずつ 別ファイルに用意した登録文字に置換して表示するには どのようにしたらよいでしょうか。 (サンプルを提示できなくてすみません)

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

  • ベストアンサー
  • manimani2
  • ベストアンサー率70% (12/17)
回答No.1

こんにちは。 *「別ファイル」というのがどんな形式なのかによって、その部分のコードは変わりますし、ちょっと質問の意味合いもわかりにくい所がありますので参考程度にご覧ください。 例えば別ファイルというのが何でもよく、「この文字が入っていたら、この文字へ置き換える」というのが、予めpupuaさんの中で決まっているのでしたら、「,(カンマ)」で変換前と変換後の文字を区切ったCSVファイルを用意し、 [moji_data.csv] 夏,冬 甘,辛 高,低 ・ ・ ・ というように記載していきます。(上の例だと最終的に「『夏』という字があったら、『冬』に置き換える」「『甘』という字があったら、『辛』に置き換える」となるように考えています。) そして、コードとしては.... [okikae.php] <?php //フォームからのデータを受け取ります。 $str = $_POST['str']; //「別ファイル」(ここではCSVと仮定)の読み込み準備 $filename = "./moji.csv"; $row=0; $data = array(); //CSVファイルの中身を読みながら、該当する漢字が含まれていれば置き換えていく。 $handle = fopen($filename, "r"); while (($tmp = fgetcsv($handle, 1000, ",")) !== FALSE) { $data[$row]["before"] = $tmp[0]; $data[$row]["after"] = $tmp[1]; $str = mb_ereg_replace($data[$row]["before"], $data[$row]["after"], $str); } //結果を表示 print $str; ?> このCSVの内容でいくと、フォームから「夏は甘い」と打ち込むと、結果は「冬は辛い」と表示されるはずです。お試しあれ。

noname#184731
質問者

お礼

お答えありがとうございます。 投稿後、丸投げは×ということを知りあきらめていました。 (すみませんでした) さっそく、フォームページを作成し、 <form action="./okikae.php" method="post"> <input type="text"> <input type="submit" value="送信"> </form> からアクセスすると、正規表現がなんとか・・のWarningが表示されます↓。 Warning: mb_ereg_replace() [function.mb-ereg-replace]: mbregex compile err: premature end of regular expression in /・・ 日本語も英字も同じ結果です。 mb_ereg_replace()について検索してみたのですが解決できませんでした。 あと少しで望んでいたことができそうなので、できればアドバイスをお願いします。 サーバー(xrea)のせいでしょうか?

その他の回答 (2)

  • manimani2
  • ベストアンサー率70% (12/17)
回答No.3

念のためという意味を込めて、一つ一つ確認をしていってください。 ■コンパイルエラーについて 本当にCSVファイルはUTF-8になっているかどうか。TeraPADの設定がおかしくないかもう一度確認等。(一度、全部EUC-JPで試してみてもいいかもしれません) ■夏だけ変換されないことについて コードをいじっていませんか?CSVは1行ごとに読みこんでいき、カンマの部分で切り分けています。一行目の「夏」だけ変換されないのであれば、一行目を読み込めていないのかもしれません。コード内の $data[$row]["before"] = $tmp[0]; $data[$row]["after"] = $tmp[1]; を、誤って $data[$row]["before"] = $tmp[1]; $data[$row]["after"] = $tmp[2]; としていないでしょうか?念のため確認してください。配列は0からスタートします。 あと、一度ためしにCSVで「"(ダブルクォーテーション)」を入れてみてください。 [csv] "夏","冬" というようにです。私の環境では先のサンプルコードで正常に作動しましたので、これ以上何とも言えませんが(ちなみにApach2)、可能であれば他のサーバーや環境で動作を確認し、全ての環境で出現するエラーなのか、それとも、今使っている環境により発生しているものなのかを考えてみてください。 その上で、エラーの出るコードと使っている環境を掲示し、助けを求めれば解決できるかもしれません。

noname#184731
質問者

お礼

お答えありがとうございました。 以下、アドバイスいただいた事項です。 ・TeraPAD以外にも、KutoCsvEditorでUTF-8保存を確認 ・SHIFT-JIS・EUC・UTF-8のうち、UTF-8のみOK(改行コードはWin用CR+LF) ・csvファイルの先頭行を空白にすると「夏」が「冬に」置換される(コードは変更していません) ・ダブルクォーテーションではコンパイルエラー発生。何回か再読み込みすると表示される場合があるが、無置換 ・他のサーバーや環境での動作確認は残念ながらできない状況です 現況では時々コンパイルエラーが生じますが、csvファイルの内容や更新時の保存形式に問題があるようです。 今後、もっといろいろ勉強しながら検討してみたいと思います。 本当にご親切なお答えありがとうございました。

  • manimani2
  • ベストアンサー率70% (12/17)
回答No.2

うーん、文字コードがらみの問題だと思うのですが、どうなんでしょう・・・。 とりあえず、フォーム部分に「name="str"」を入れていただき、 <input type="text" name="str"> とした上で(ただの転記ミスかな)、日本語の文字コードを見返してみてください。できればShift_JISは避け、EUCかUTF-8で全て揃えてみてください。Shift_JISでは一部の漢字がPHP内でそのまま使えませんので・・・。ちなみに、「全て揃える」というのは、CSV、PHP、HTMLの3つの事です。 ちなみにこのエラーについて 参考になる一文がありましたので、URLを入れておきますね。 http://www.exist.net/blog/2008/05/warning_mbregex_compile_err_pr.html http://php.benscom.com/manual/ja/function.mb-regex-encoding.php

noname#184731
質問者

お礼

度々すみません。formのname="str"が抜けていました。 おかげさまで、各ファイルの文字コードUTF-8でコンパイルエラーは解消しました。 ただ、moji_data.csvが 夏,冬(※夏は入力パターンをいろいろ変えても置換されません) 甘,辛 高,低 のままだと問題ないんですが、 csvファイルに他の語句を追加するとコンパイルエラーが起こります。 (Tera PadからUTF-8でファイルを開き、語句を追加後UTF-8で上書き保存) 念のため、 //結果を表示の箇所で、 mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); mb_regex_encoding(mb_internal_encoding()); print $str; をそれぞれ試してみましたが、結果は同じです。

関連するQ&A

専門家に質問してみよう