PHPで入力された文字列の長さのフィルタリング
http://www.php.net/manual/ja/book.filter.phpを参考に。
文字列の長さもフィルタリングしたい。
ユーザー定義の関数でデータをフィルタリングしたいときはFILTER_CALLBACKフィルタを使う。
例えば1文字以上5文字以下の文字列なら
<?php function FILTER_VALIDATE_LENGTH($value) { $len = mb_strlen($value); if (1 <= $len && $len <= 5) { return $value; } return false; } $tests = array( '', // 空文字列 'あ', // 1文字 'あいうえお', // 5文字 'あいうえおか', // 6文字 ); foreach ($tests as $test) { var_dump(filter_var($test, FILTER_CALLBACK, array('options' => 'FILTER_VALIDATE_LENGTH'))); }
$ php foo.php bool(false) string(3) "あ" string(15) "あいうえお" bool(false)
任意の長さの文字列をフィルタリングしたいなら(ついでにエンコーディングも指定したい場合)
<?php function makeFilterValidateLength($min, $max, $encoding = null) { if (is_null($encoding)) { $encoding = mb_internal_encoding(); } return function ($value) use ($min, $max, $encoding) { $len = mb_strlen($value, $encoding); if ($min <= $len && $len <= $max) { return $value; } return false; }; } $tests = array( '', // 空文字列 'あ', // 1文字 'あいうえお', // 5文字 'あいうえおか', // 6文字 ); foreach ($tests as $test) { var_dump(filter_var($test, FILTER_CALLBACK, array('options' => makeFilterValidateLength(5, 5)))); }
$ php foo.php bool(false) bool(false) string(15) "あいうえお" bool(false)
エンコーディングの指定が省略されてたらmb_internal_encoding()を使うようにする。