<?php
define('FILTER_STRUCT_FORCE_ARRAY', "\0FILTER_STRUCT_FORCE_ARRAY\0");
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])) {
return $default;
}
$var = $types[$type];
$is_recursive_static = true;
} else {
$var = $type;
}
$ret = array();
foreach ($default as $key => $value) {
if ($value === FILTER_STRUCT_FORCE_ARRAY) {
$ret[$key] = array();
$arr = isset($var[$key]) ? (array)$var[$key] : array();
foreach ($arr as $k => $v) {
if (is_string($v) && preg_match('//u', $k) && preg_match('//u', $v)) {
$ret[$key][$k] = $v;
}
}
} elseif (!isset($var[$key])) {
$ret[$key] = $value;
} elseif (is_array($value)) {
$ret[$key] = filter_struct_utf8($var[$key], $value);
} elseif (is_array($var[$key]) || !preg_match('//u', $var[$key])) {
$ret[$key] = $value;
} else {
$ret[$key] = $var[$key];
}
}
if (!$is_recursive) {
$is_recursive_static = false;
}
return $ret;
}
// テスト用として代入($_POST['email']は未定義)
$_POST['name'] = array( // 異常な値(本来は文字列で来るはず)
'hahaha' => 'I am an array',
);
$_POST['age'] = '20'; // 正常な値
$_POST['gender'] = 'male'; // 正常な値
$_POST['options] = array(
'b' => 'yes', // 正常な値
'c' => array('hahaha' => 'This is an invalid option'), // 異常な値(本来は配列はネストしないはず)
);
// $_POSTの要素を期待する形になるようにシンボルテーブルにインポートする
extract(filter_struct_utf8(INPUT_POST, array(
'name' => '', // 異常なときは強制的に空文字列にする
'age' => '', // 異常なときは強制的に空文字列にする
'email' => '', // 異常なときは強制的に空文字列にする
'gender' => '', // 異常なときは強制的に空文字列にする
'options' => FILTER_STRUCT_FORCE_ARRAY, // 強制的に一次元配列にする
)));
// 値を見てみる
var_dump($name, $age, $email, $gender, $options);
- Output for 5.4.20
- Parse error: syntax error, unexpected 'b' => '' (T_CONSTANT_ENCAPSED_STRING), expecting ']' in /in/oIqJh on line 59
Process exited with code 255. - Output for 5.4.0 - 5.4.19
- Parse error: syntax error, unexpected 'b' => '' (T_CONSTANT_ENCAPSED_STRING), expecting ']' in /in/X2mfr on line 59
Process exited with code 255. - Output for 5.3.0 - 5.3.27
- Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ']' in /in/X2mfr on line 59
Process exited with code 255.
preferences:
177.82 ms | 1395 KiB | 56 Q