文字列の最初と最後のスペースを取り除きたい
PHPのtrim()を使おうと思ったら、残念ながら全角スペースは取り除かれない仕様だった。
半角スペースだけじゃなく全角スペースも除きたかったので、その実装をメモしておく。
PHPのtrim()について
PHPのtrim()の仕様は以下。
この関数は
str
の最初および最後から空白文字を取り除き、 取り除かれた文字列を返します。2番目のパラメータを指定しない場合、 trim()は以下の文字を削除します。
- ” ” (ASCII 32 (0x20)), 通常の空白。
- “\t” (ASCII 9 (0x09)), タブ。
- “\n” (ASCII 10 (0x0A)), リターン。
- “\r” (ASCII 13 (0x0D)), 改行。
- “\0” (ASCII 0 (0x00)), NULバイト
- “\x0B” (ASCII 11 (0x0B)), 垂直タブ
というわけで、trim()では全角スペースは除去されない。
また、第2引数で取り除く文字を指定できるのだが
trim()はマルチバイトに対応していないため、正常動作しない模様。
正規表現を使う
PHPのtrimって、全角の空白(スペース)は削除してくれないのですか? – メモ帳@プログラマー初級
こちらを参考に、正規表現を使って全角スペースの除去ができた。
function trim_emspace ($str) { // 先頭の半角、全角スペースを、空文字に置き換える $str = preg_replace('/^[ ]+/u', '', $str); // 最後の半角、全角スペースを、空文字に置き換える $str = preg_replace('/[ ]+$/u', '', $str); return $str; }
全角スペースを半角スペースに置換する
2012/06/24 追記
前述の方法だと、最初と末尾以外の全角スペースも半角になってしまうため、trim()と動作が変わってしまっていました。
mb_convert_kana()の紹介と、自戒の念も込めて、ソースは残しておきます。
上記の正規表現での実装をしてみて、できたよー(^O^)/ と思ったのだが
あとから考えたら、全角スペースを半角スペースに置換すれば、そのままtrim()が使えるんじゃね?あたしって、ほんとバカ
という事に気付いたので、これも書いておく。
置換には[全角] – [半角]の変換ができる、mb_convert_kana()を使う。
// 第2引数に"s"を指定で、全角スペースを半角スペースに変換 $str = trim(mb_convert_kana( $str, "s"));
mb_convert_kana()の第2引数で使用可能な変換オプションについてはマニュアル参照。
ちなみに mb_convert_kana()は、日本語のみで使用可能。
全角を半角に変換してtrim()すると、最初と末尾じゃない全角スペースが半角になっちゃう副作用はないかな?
あ!確かにそうですね…ご指摘ありがとうございます!