プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。お世話になっております。
先日、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つ?」と気になり質問させてもらいました。

少々回りくどい質問、かつ説明が足りないところがあるかと思いますが、この半角スペースの件、ならびに、このような状況の文字化けに関して、アドバイスなど頂戴出来れば幸いです。宜しくお願いいたします。

A 回答 (2件)

文字化け?


つまり日本語を使っているのかな?
もしそうならその 4951480 の質問で回答してくれている mb_* を使っていないからだと思うけど?

マルチバイト文字が何であるかをまず知った方が良いんじゃないのかなぁ…
http://www.google.com/search?lr=lang_ja&q=%E3%83 …
    • good
    • 0
この回答へのお礼

SAYKA様

こんばんは。早速のアドバイスを有難う御座います。
変数に代入されている文字列は日本語なのですが、別ファイルに登録してある削除したい単語は、半角英数字、または全角英数となっています。

ご忠告後、前回ご回答下さったように、mb_ereg_replaceを試していますが、一部の半角記号を削除しようとすると、mb_ereg_replaceの部分でエラーが出てしまうのですが、この場合は削除したい単語がバイト数などで判別して使い分けた方が良いのでしょうか?

何か対処法がありましたら、引き続きアドバイスいただけたら幸いです。宜しくお願いいたします。

お礼日時:2009/05/15 22:32

>全角英数


しつこいようだけど マルチバイトについて 調べた方が良いよ。


>mb_ereg_replaceの部分でエラーが出てしまう
「エラーが出る」って言われてもそれだけじゃ流石に情報が足りないよ・・・。
どんな正規表現文字列を使ってどんなエラーなのか、それが判らないと「正規表現がおかしいだけでしょ」としか言いようが無いからね。

そういう意味では mb_* は無関係に正規表現がおかしいだけかもしれない・・・
    • good
    • 0
この回答へのお礼

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に関しては、今回の問題が解決できてからと思ってます)

お礼日時:2009/05/17 12:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!