@ 2013-09-29T17:06:50Z <?php
/**
* @param integer $type Constant like INPUT_XXX
* @param array $default Default structure of the specified super global var.
* Following bitmasks are available:
* + FILTER_STRUCT_FORCE_ARRAY - Force 1D array.
* + FILTER_STRUCT_TRIM - Set trimmed string.
* + FILTER_STRUCT_FULL_TRIM - Trim including full-width and no-break space.
* @return string The value of the filtered super global var.
* @see http://qiita.com/items/c39b9ee695a5c2e74627
*/
define('FILTER_STRUCT_FORCE_ARRAY', 1);
define('FILTER_STRUCT_TRIM', 2);
define('FILTER_STRUCT_FULL_TRIM', 4);
function filter_struct_utf8($type, array $default) {
static $is_recursive_static = false;
$is_recursive = $is_recursive_static;
if (!$is_recursive) {
$types = array(
INPUT_GET => $_GET,
INPUT_POST => $_POST,
INPUT_COOKIE => $_COOKIE,
INPUT_REQUEST => $_REQUEST,
INPUT_ENV => $_ENV,
INPUT_SERVER => $_SERVER,
);
$type = (int)$type;
if (!isset($types[$type])) {
throw new LogicException('unknown super global var type');
}
$var = $types[$type];
$is_recursive_static = true;
} else {
$var = $type;
}
$trim_chars = "\\0\x20\x09\x0a\x0d\x0b";
$full_trim_chars = "{$trim_chars}\xc2\xa0\xe3\x80\x80";
$trim_pattern = "/\A[{$trim_chars}]++|[{$trim_chars}]++\z/u";
$full_trim_pattern = "/\A[{$full_trim_chars}]++|[{$full_trim_chars}]++\z/u";
$ret = array();
foreach ($default as $key => $value) {
if (is_int($value) && !($value & (
FILTER_STRUCT_FORCE_ARRAY |
FILTER_STRUCT_FULL_TRIM |
FILTER_STRUCT_TRIM
))) {
if (!$is_recursive) {
$is_recursive_static = false;
}
throw new LogicException('unknown bitmask');
}
if (is_int($value) && $value & FILTER_STRUCT_FORCE_ARRAY) {
$tmp = array();
if (isset($var[$key])) {
foreach ((array)$var[$key] as $k => $v) {
if (!preg_match('//u', $k)) {
continue;
}
$value &= FILTER_STRUCT_FULL_TRIM | FILTER_STRUCT_TRIM;
$tmp += array($k => $value ? $value : '');
}
}
$value = $tmp;
}
if (isset($var[$key]) && is_array($value)) {
$ret[$key] = filter_struct_utf8($var[$key], $value);
} elseif (!isset($var[$key]) || is_array($var[$key])) {
$ret[$key] = is_int($value) ? '' : $value;
} else {
if (!isset($var[$key]) || is_array($var[$key])) {
$var[$key] = null;
} elseif (is_int($value) && $value & FILTER_STRUCT_FULL_TRIM) {
$var[$key] = preg_replace($full_trim_pattern, '', $var[$key]);
} elseif (is_int($value) && $value & FILTER_STRUCT_TRIM) {
$var[$key] = preg_replace($trim_pattern, '', $var[$key]);
} else {
$var[$key] = preg_replace('//u', '', $var[$key]);
}
if ($var[$key] === null) {
$var[$key] = is_int($value) ? '' : $value;
}
$ret[$key] = $var[$key];
}
}
if (!$is_recursive) {
$is_recursive_static = false;
}
return $ret;
}
// テスト用として代入($_POST['email']は未定義)
$_POST['name'] = array( // 異常な値(本来は文字列で来るはず)
'INVALID' => 'これは無効な値です',
);
$_POST['age'] = ' 20 '; // 正常な値(半角スペースが混入)
$_POST['gender'] = ' male '; // 正常な値(半角スペースと全角スペースが混入)
$_POST['comment'] = ' はじめまして!! '; // 正常な値
$_POST['options'] = array(
'a' => 'yes', // 正常な値
'b' => "\x0a\x0a\xff", // 値のエンコーディングが壊れている
'c' => array('INVALID' => 'これは無効な値です'), // 異常な値(本来は文字列で来るはず)
"\x0a\x0a\xff" => 'INVALID', // キーのエンコーディングが壊れている
);
// $_POSTの要素を期待する形になるようにシンボルテーブルにインポートする
extract(filter_struct_utf8(INPUT_POST, array(
'name' => '', // 異常なときは強制的に空文字列にする
'age' => FILTER_STRUCT_FULL_TRIM, // 全角スペースなども含むトリミングを行う
'email' => '', // 異常なときは強制的に空文字列にする
'gender' => '', // トリミングを行う
'comment' => '', // 異常なときは強制的に空文字列にする
// 強制的に一次元配列にし、各要素に対して全角スペースなども含むトリミングを行う
'options' => FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_FULL_TRIM,
)));
// 値を見てみる
var_dump($name, $age, $email, $gender, $options);
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Output for git.master , git.master_jit , rfc.property-hooks Fatal error: Uncaught Error: Undefined constant "INPUT_REQUEST" in /in/VRLgX:24
Stack trace:
#0 /in/VRLgX(108): filter_struct_utf8(0, Array)
#1 {main}
thrown in /in/VRLgX on line 24
Process exited with code 255 . This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.
Active branches Archived branches Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page
preferences:dark mode live preview
42.01 ms | 401 KiB | 8 Q