Hatena::ブログ(Diary)

はなちん C-x C-c

2011-09-13

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()を使うようにする。