こんにちわ、こんばんわ。最近はKANA-BOONをたまに聴きます。今日はフルドライブ聴いてます。こういうシンプルで若いなって感じのたまに聴くといいのぉって思います。
さて、以下のオーダーを頂きました。
ひらがな、カタカナ(「-」を除く)、漢字、英数字のみを使い記号、スペースは除く。
こういうの、今まで何回も作ってきた気もするんですが、いつも忘れてしまうんですよね。思いつくのは
・preg_replaceを使ってUTF8文字コード\x000とかなんとかで変換かける
・mb_convert_kanaを使って全角を半角にしたうえでなんとかする
とりあえずmb_convert_kana使ってみますか
1 2 3 |
$value = "~1F - 22 & \nSan.<strong>おしゃまんべ</strong>"; $result = mb_convert_kana($value, 'as'); echo $result; |
1 2 |
~1F - 22 & San.<strong>おしゃまんべ</strong> |
あとは記号・空白や改行ですね。ASCII文字コードで記号の16進コードを確認して記号・空白を抽出する正規表現は[\\x0-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]だと分かりました。すいません、もっと簡単かと思いましたけど思ったより記号がコード表の中で分散していたのでコードが長くなっちゃいました。
あと本当はね、、引用符(wikipedia)の半角文字も考慮しないといけないんだよね・・・「”」じゃなくて「”」とか。ブラウザだと同じに見えてるかもしれないけど、最初のが"で後のは”だからね。面倒だ〜;;後で考えます。
1 2 3 4 |
$value = "~1F - 22 & \nSan.<strong>おしゃまんべ</strong>"; $result = mb_convert_kana($value, 'as'); $result = preg_replace('/[\\x0-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]/', '', $result); echo $result; |
1 |
1F22Sn<strong>おしゃまんべ</strong> |
うん、できた。
でもこれで終わると面白く無いのでもっと簡単にできないか調べてみると、PHP5.2からFilter関数(PHPマニュアル)というのがあるのがわかりました。
メールアドレスが有効かどうか調べて、メールアドレス部分だけ取り出すとか簡単です。次のコードでメールアドレスが取り出せます。
1 |
$email = filter_var('てすと(user@example.jp)',FILTER_SANITIZE_EMAIL); |
第3引数に定数じゃなくて配列を渡すこともできます。
数値が0~10の整数の範囲か調べて、無効なら0を返すにはこうなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var_dump( filter_var( '1', FILTER_VALIDATE_INT, array( 'options' => array( 'default' => 0, // フィルタが失敗した場合に返す値 // その他のオプションをここに書きます 'min_range' => 0, 'max_range' => 10 ), 'flags' => FILTER_FLAG_ALLOW_OCTAL, ) ) ); |
min_rangeとかfragsのFILTER_FLAG_ALLOW_OCTALとかは、FILTER_VALIDATE_INTフィルタで許可されているオプションです。
おぉ、、なんかフレームワークがやるような処理を組み込んでる。さすがPHP!おせっかいさん!憎いぜ!これなら最初の関数も簡単にできるかも!
・・・できませんでした。デフォルトで用意されている除去フィルタの一覧をみると、最低限のものしかない印象。
自分で登録したコールバック関数使ってみます。
1 2 3 4 5 6 7 8 9 10 |
function foo($str){ $str = mb_convert_kana($str, 'as'); $str = preg_replace('/[\\x0-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]/', '', $str); return $str; } var_dump(filter_var( "~1F - 22 & \nSan.<strong>”おしゃまんべ”</strong>コース", FILTER_CALLBACK, array('options'=>'foo') )); |
1 |
1F22Sanstrong”おしゃまんべ”strongコース |
できたできた。引用符の問題については、Filter関数でも解決してくれないぽくて疲れたのでまた今度。[\\x0-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f“”‘’]でいけるかと思ったら、他の文字が壊れたりしてハマっちゃったんですよ。昔やった時はstr_replaceとかで一文字づつ消した気がしますよ。なんかいい方法があれば教えて下さい。
GETやPOSTをフィルタリングしてくれるfilter_input/filter_input_arrayなんかでも同じパラメータで使えるので、使い回しを考えるとFilter関数いいかもしれません。