• 締切済み

データ末尾の半角スペース

こんにちは。お世話になっております。 先日、http://oshiete1.goo.ne.jp/qa4951480.html にて、質問させていただき、状況こそ違うのですが、変数に代入された文字列から、事前に登録された単語や記号を削除すると、変数に代入された文字列に一部文字化けが起こる現象が続いています。 ※前回の質問では、str_replaceにて指定文字を削除していましたが、str_ireplaceの方が文字化けの頻度が少ない。 色々と試行錯誤を繰り返しながら、その対策を試しているのですが、一向に改善する兆しがなく困っている状況です。 ちなみに、事前に登録された単語や記号とは、別ページにて、入力されたフォームからデータをPOSTにて受け取り、以下のようなスクリプトで登録を行っています。 //$keyword = trim($keyword).PHP_EOL; $keyword = trim($keyword)."\n"; $file = fopen($file_name, "a") or die("OPENエラー $file_name"); flock($file, LOCK_EX); fputs($file, $keyword); flock($file, LOCK_UN); fclose($file); chmod($file_name,0606); そこで、削除したい単語をブラウザで表示(tableを使って表示)してみたところ、登録されている単語の末尾に、半角スペースがある状況です。 これは以前にも他のプログラムでも気づいてはいたのですが、今回のように不具合が一向に直らない状況で、「もしかしたらこれも原因の1つ?」と気になり質問させてもらいました。 少々回りくどい質問、かつ説明が足りないところがあるかと思いますが、この半角スペースの件、ならびに、このような状況の文字化けに関して、アドバイスなど頂戴出来れば幸いです。宜しくお願いいたします。

みんなの回答

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

>全角英数 しつこいようだけど マルチバイトについて 調べた方が良いよ。 >mb_ereg_replaceの部分でエラーが出てしまう 「エラーが出る」って言われてもそれだけじゃ流石に情報が足りないよ・・・。 どんな正規表現文字列を使ってどんなエラーなのか、それが判らないと「正規表現がおかしいだけでしょ」としか言いようが無いからね。 そういう意味では mb_* は無関係に正規表現がおかしいだけかもしれない・・・

a4_chapp
質問者

お礼

SAYKA様 おはようございます。 >「エラーが出る」って言われてもそれだけじゃ流石に情報が足りないよ・・・。 仰るとおりです。すみません。汗 mb_ereg_replaceですが、別ファイルに登録のある単語を削除するために $f_data_array = file($file_name); $f_cnt= count($f_data_array); for($h=0; $h<$f_cnt; $h++){  $delete_key = trim($f_data_array[$h]);  $data = mb_ereg_replace($delete_key, " ", $data);//半角角スペースに置き換えている } としているのですが、そうすると以下のようなエラーが表示される状況です。 Warning: mb_ereg_replace() [function.mb-ereg-replace]: mbregex compile err: premature end of char-class in Warning: mb_ereg_replace() [function.mb-ereg-replace]: mbregex compile err: target of repeat operator is not specified in Warning: mb_ereg_replace() [function.mb-ereg-replace]: mbregex compile err: end pattern at escape in Warning: mb_ereg_replace() [function.mb-ereg-replace]: mbregex compile err: end pattern with unmatched parenthesis in Warning: mb_ereg_replace() [function.mb-ereg-replace]: mbregex compile err: unmatched close parenthesis in Warning: mb_ereg_replace() [function.mb-ereg-replace]: mbregex compile err: target of repeat operator is not specified in で、前回のお礼のご挨拶のときにも書きましたが、for文の中で削除する際、その単語をバイト数で分別して、 if(strlen($delete_key) >= 2){  $data = mb_ereg_replace($delete_key, " ", $data);//全角スペースに置き換えている }else{  $data = str_ireplace($delete_key, " ", $data);//全角スペースに置き換えている } このようにすると、とりあえず?不具合は回避出来るようになったのですが、このようなスクリプトってやはり効率は悪いのでしょうか・・。 (前回の質問時にアドバイスいただいたforeachに関しては、今回の問題が解決できてからと思ってます)

全文を見る
すると、全ての回答が全文表示されます。
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

文字化け? つまり日本語を使っているのかな? もしそうならその 4951480 の質問で回答してくれている mb_* を使っていないからだと思うけど? マルチバイト文字が何であるかをまず知った方が良いんじゃないのかなぁ… http://www.google.com/search?lr=lang_ja&q=%E3%83%9E%E3%83%AB%E3%83%81%E3%83%90%E3%82%A4%E3%83%88%E6%96%87%E5%AD%97%E3%81%A8%E3%81%AF

a4_chapp
質問者

お礼

SAYKA様 こんばんは。早速のアドバイスを有難う御座います。 変数に代入されている文字列は日本語なのですが、別ファイルに登録してある削除したい単語は、半角英数字、または全角英数となっています。 ご忠告後、前回ご回答下さったように、mb_ereg_replaceを試していますが、一部の半角記号を削除しようとすると、mb_ereg_replaceの部分でエラーが出てしまうのですが、この場合は削除したい単語がバイト数などで判別して使い分けた方が良いのでしょうか? 何か対処法がありましたら、引き続きアドバイスいただけたら幸いです。宜しくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 半角全角スペースの削除(先頭&末尾)

    やまとです。 ある文字列の先頭と末尾のスペースを取り除きたいのですが、 どのようにしたら良いでしょうか? 事前に試した事が2つあります。 1.trim を使用する。  $aiueo = " あいうえ お "; $aiueo = trim($aiueo));  とすると、スペースが削除されます。  しかし、これでは全角のスペースが削除されないようですね。 2.置換する。  $aiueo = " あいうえ お ";  $aiueo = str_replace( ' ', '', $aiueo );  とすると、全角のスペースが削除されます。  しかし、文字列の先頭と、末尾以外の全角スペースも削除されてしまう  ようですね。 では、文字列の先頭と末尾の半角スペースと全角スペースを削除したい場合は どのようにしたら良いでしょうか? ご教授願います。

    • ベストアンサー
    • PHP
  • 文字列から指定文字を削除

    こんばんは。お世話になっております。 先日、http://oshiete1.goo.ne.jp/qa4940684.html こちらにて別ファイルにある文字列を変数に代入することをお教えいただきました。(今回の件とは直接的に関係ないと思うのですが・・) 今回再度質問させて頂きたいのは、変数に代入されているテキスト(改行を含まない一行テキスト)を、違う別のファイルに登録されている単語を削除したい。というものです。 その別ファイル(削除すべき単語が登録されているファイル)は、 1 2 3 、 。 のように登録されていており、削除する際、 //変数、$moto_txtに長文の1行テキストが代入されてる。 $file_name = "./data/key.txt";//排他単語の取得 if(file_exists($file_name)){  $f_data_array = file($file_name);  $f_cnt= count($f_data_array);  for($h=0; $h<$f_cnt; $h++){   $delete_key = trim($f_data_array[$h]);   $moto_txt = str_replace($delete_key, "", $moto_txt);//  } } のように、削除したい単語が登録されているファイルを単語単位で配列に格納し、for文で$moto_txtからstr_replace()を使って削除しようとすると、何故か他の文字(今確認しているのは、「ア」です)まで削除されてしまう状況となっております。 何か他の方法はないかな?と色々と調べているのですが、その方法が分からず、また、上記の流れで、何故他の単語まで削除されてしまうのかが分かりません。 どんな些細なことでも結構ですので、アドバイスいただけると幸いです。

    • ベストアンサー
    • PHP
  • カラムの末尾にスペースが入る

    VBAで固定長のファイルをテーブルに取り込みCSVファイルとしてカンマ区切りで書き出すというプログラムを作っています。 1111,55___,77____,5_____,77__,555____,999__      _はスペースのことだと思って下さい。 などといった感じのファイルを取り込むのですが、スペースを削除するためにTrimで切ってテーブルに取り込んでいるのですが、取り込むと必ずいくつかの決まったカラムに半角スペース6個分のスペースが入ってしまいます。 カラムの文字制限10で入力文字が2などなら、6個分のスペースが入り、 入力文字が7ならスペースは3つ入り、入力文字が10ならスペースは入らないという現象が起きています。 Trimで切っているのですから、入力文字が何文字であろうとスペースは入らないはずなのですが、決まったカラムにだけこの現象が起きています。 デバッグで見てみたところ、データを取得しているところでは、きちんとTrimで切られている形で取得することが出来ているのですが、テーブルの中を見ると半角スペースが上の規則で入っているというのが現在の現象です。 なぜこのようなことが起きるのか・・どなたか解決策が分かる方はいらっしゃいますでしょうか。お願いします。

  • mb_convert_encodingとUTF

    mb_convert_encodingでUTF-8>JIS変換行う場合 $fileにファイル内容全部が読み込まれた状態で、mb_convert_encoding($file, "JIS", "UTF-8")とした場合、$fileの冒頭に?という文字化けが残ります。 これを削除もしくは表示させないようにするにはどうしたらよいのでしょうか? if(($buf = mb_convert_encoding(file_get_contents("$file"), "jis","utf-8"))<>""){ $file = tmpfile(); fwrite($file, $buf); rewind($file); if((flock($file,LOCK_EX))!==false){ while(!feof($file)){ $str = fgetcsv($file,1000,","); <処理~~~~> } } fclose($file); }

    • ベストアンサー
    • PHP
  • 末尾の全角スペースの削除

    SQL Server 2008環境です。 文字列の末尾の空白を一括して削除したくて、以下のようなクエリを書きました。 UPDATE TEST_TABLE SET NAME = REPLACE(RTRIM(REPLACE(StoreBranchName, ' ', ' ')), ' ', ' ') 全角スペースを一度半角スペースにして、RTRIMをかけた後、最後に 半角スペースを全角に直すというものです。 しかし、これだと、元々半角スペースが入っていた場合、そっちまで全角スペースに なってしまうため悩んでおります。 うまいやり方を教えていただけないでしょうか。 宜しくお願いします。

  • JacaScriptのスペース削除について

    JavaScriptのスペース削除についての質問です。以下のコードで、入力された値が空白又はAllブランクだった時の処理をしています。ここに、前後に全角半角スペースが入力された場合は、それを削除する、という処理を入れたいので、以下のようにしています。 /*(1)*/function trim(nameTXT) { return nameTXT.replace(/^[ \t\r\n]+|[ \t\r\n]+|[ \t\r\n]+|[ \t\r\n]+$/g, ""); } // 未入力またはスペース入力時のアラート及びフォーカス処理関数 function check() { var nameTXT = document.formMerchandise.name.value; if(trim(nameTXT).match(/ |\s+/)||trim(nameTXT)==""){ alert("商品名を入力してください"); document.formMerchandise.name.focus(); return false; } if(trim(nameTXT)>25){ alert("商品名は25文字までです"); document.formMerchandise.name.focus(); return false; } return true; } ネットを参考にしながらではあるのですが、(1)で自作メソッドを作成し、その中で「受け取った文字の前後にある全角半角スペースを削除して戻す」という処理を実装してみました。半角スペースに関しては期待通りの処理を行えたのですが、全角スペースに関しては削除されず、文字として認識されてしまっています。 例えば (半角スペース) " 商品名 "→"商品名" (全角スペース) " 商品名 "→" 商品名 " となってしまいます。半角スペースが削除されているので後少しとは思うのですが、どなたか教えて頂けないでしょうか?よろしくお願い致します。

  • マクロで半角・全角スペースと改行を削除したい

    マクロ初心者です。 BookA-sheetAの「F1:F40」に入っている文字列左右(前後)の半角・全角スペースと、 改行コードを削除したいのですが、書いてみたマクロはエラーが出てしまいます。 trim関数と、改行コード削除はどう組み合わせればよいのでしょうか? 初心者で申し訳ないのですが、ご教示いただければ幸いです。

  • PHPでのファイルオープンの仕方について

    いつもこちらで勉強させていただいております。 初歩的な質問になるかもしれませんが、ご教授いただけたら幸いです。 windows7にて、VMware playerという仮想PCを作成するソフトを使い、Ubuntu(Linax)上でPHPの学習を行っております。 聞きたいこととしては、以下のプログラムを実行すると、 OPENエラー test.txt  と表示されるのはなぜなのか、ということです。 <html> <head> <title> ファイルにデータを書き込む </title> </head> <body> <?php $file_name = "test.txt"; $file = fopen($file_name, "a") or die("OPENエラー $file_name"); flock($file, LOCK_EX); $string = "文字列を書き込む"; fputs($file, $string); flock($file, LOCK_UN); fclose($file); ?> </body> </html> 参考書に載っていたプログラムそのまま書いたつもりですが、何がダメなのかが解りません。 設定ファイルか何かに特別なことをしなければいけないのでしょうか? 初歩的な質問になるかもしれませんが、聞ける人がいなく困っております。どなたかご存知の方がいらっしゃったら、教えて下さい。 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • ATOKの単語登録を半角だけ又は全角だけにしたい

    ATOKの単語登録を半角だけ又は全角だけにしたい Windows XPでATOK 2005を使っていますが、単語登録をすると、例えば次のように、半角文字と全角文字と両方登録されます。 登録時にキー入力した文字:2010年 (※数字の部分を半角で入力して登録しました) 実際に登録された文字:2010年、2010年 (※数字の部分が半角のものと全角のものと両方登録されました) 単語登録の時に全角で入力したものは全角だけで、半角で入力したものは半角だけで登録したい(つまり、両方は登録したくない)のですが、そのようにするにはどうしたらいいでしょうか。

  • 文字列の削除

    char str[]="/home/name/file.c"; という文字列から"file.c"の部分を削除したいのですが どのようにすればできますでしょうか? 教えて下さい。お願いします。