trim関数で文字化け
検索結果の検証をしていたら、入力文字列によっては条件が無視されることが判明。
なお文字列についてはこんな処理をしてます。
- ホワイトスペース(全角空白含む)をトリミング
- バリデーション:UTF-8で解釈できない場合は長さゼロの文字列で上書き
その結果、POSTデータとしては渡されてるのに、しっかり長さゼロの文字列で上書きされてる。試しに上書きしないようにすると一部が文字化け。そっか、このせいでUTF-8で解釈できないと見なされたんだな……。
元凶はtrim関数。なんと!マルチバイト文字に対応していないんだそうで……(
PHP trimで文字化け)。
仕方がないので、参考サイトを見習って自前の関数を作成。
function mb_trim($str, $charlist='[:space:]\0 ', $encoding='UTF-8'){
mb_regex_encoding($encoding); //指定しないと、環境次第でトリミングが正常に動作しない
$str = mb_ereg_replace("^[$charlist]+", '', $str);
return mb_ereg_replace("[$charlist]+$", '', $str);
}
これでtrimと同等の" \t\n\r\0\x0b"に加え、全角空白もトリミングされるかと。
それにしてもmb_ereg_replaceって、複数箇所を一度に指定できないんですねえ。"^[$charlist]+|[$charlist]+$"とか書いたら、前後どちらかしかトリミングしてくれませんでした。オプションスイッチの指定ができると思って探してみたけど、どうもないみたい。試しに"/^[$charlist]+|[$charlist]+$/g"とやってもダメ。
追記
よく見たら、最初考えた正規表現パターンは()でくくってないじゃん……。
ちゃんとくくってみたらうまくいったので、二回のmb_ereg_replaceは↓に差し替え
return mb_ereg_replace("(^[$charlist]+|[$charlist]+$)", '', $str);
2010/09/30 20:36:14更新
最終更新:2010年09月30日 20:36