2011年9月14日水曜日

PHPで入力された文字列の長さのフィルタリング



PHP: Filter - Manualを参考に。


文字列の長さもフィルタリングしたい。


ユーザー定義の関数でデータをフィルタリングしたいときは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()を使うようにする。





0 件のコメント:

コメントを投稿