trim関数で文字化け

 検索結果の検証をしていたら、入力文字列によっては条件が無視されることが判明。
 なお文字列についてはこんな処理をしてます。
  1. ホワイトスペース(全角空白含む)をトリミング
  2. バリデーション: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"とやってもダメ。

 PHPで解釈するホワイトスペース[:space:]についてはPHP 基礎編9 - 正規表現、マッチ、置き換え、ereg、eregi、eregi_replaceを参考にしました。正規表現って全部似たようなものと思いがちというか、「どうせPerlあたりが基準でしょ?」程度に軽く考えがちだけど、PHPでは\sとか書くのはダメらしい。

追記

 よく見たら、最初考えた正規表現パターンは()でくくってないじゃん……。
 ちゃんとくくってみたらうまくいったので、二回のmb_ereg_replaceは↓に差し替え
return mb_ereg_replace("(^[$charlist]+|[$charlist]+$)", '', $str);

2010/09/30 20:36:14更新
最終更新:2010年09月30日 20:36