From 90cb9b0bafca61206870b43000b712b52558e3ac Mon Sep 17 00:00:00 2001 From: oldrind <1401019000@qq.com> Date: Sat, 16 Jan 2016 14:00:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96Input=E7=B1=BB=20=E5=8F=AF?= =?UTF-8?q?=E7=94=A8setFilter()=E8=AE=BE=E7=BD=AE=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E7=9A=84=E8=BF=87=E6=BB=A4=E6=96=B9=E6=B3=95=EF=BC=8C=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E8=AE=BE=E7=BD=AE=E6=97=B6=E4=BC=9A=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0=E4=B8=AD=E7=9A=84default?= =?UTF-8?q?=5Ffilter=E4=BD=9C=E4=B8=BA=E9=BB=98=E8=AE=A4=E7=9A=84=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=96=B9=E6=B3=95=EF=BC=9B=20=E8=B0=83=E7=94=A8getDat?= =?UTF-8?q?a($name,=20$input,=20$filter,=20$default)=E6=97=B6=EF=BC=8C$fil?= =?UTF-8?q?ter=E4=BC=A0=E5=85=A5=E7=9A=84=E5=80=BC=E4=B8=BA['trim']?= =?UTF-8?q?=E6=88=96=E2=80=98trim'=EF=BC=8C=E5=88=99=E4=BC=A0=E5=85=A5?= =?UTF-8?q?=E5=80=BC=E4=BC=9A=E4=B8=8E=E9=BB=98=E8=AE=A4=E7=9A=84=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=96=B9=E6=B3=95=E5=8F=A0=E5=8A=A0=E7=94=9F=E6=95=88?= =?UTF-8?q?=EF=BC=8C=E8=80=8C=E4=BC=A0=E5=85=A5=E5=80=BC=E4=B8=BA['trim',?= =?UTF-8?q?=20false]=E6=88=96=E2=80=99trim,0'=EF=BC=8C=E5=88=99=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E7=9A=84=E8=BF=87=E6=BB=A4=E6=96=B9=E6=B3=95=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E7=94=9F=E6=95=88=EF=BC=8C=E5=8F=AA=E6=9C=89=E4=BC=A0?= =?UTF-8?q?=E5=85=A5=E7=9A=84=E6=96=B9=E6=B3=95=E7=94=9F=E6=95=88=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/think/Input.php | 217 +++++++++++++++++++++------------------- 1 file changed, 114 insertions(+), 103 deletions(-) diff --git a/library/think/Input.php b/library/think/Input.php index bfed8a20..a3b14cfd 100644 --- a/library/think/Input.php +++ b/library/think/Input.php @@ -14,7 +14,7 @@ namespace think; class Input { // 全局过滤规则 - public static $filter = null; + public static $filters; /** * 获取get变量 @@ -23,7 +23,7 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function get($name = '', $default = null, $filter = '') + public static function get($name = '', $default = null, $filter = null) { return self::getData($name, $_GET, $filter, $default); } @@ -35,7 +35,7 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function post($name = '', $default = null, $filter = '') + public static function post($name = '', $default = null, $filter = null) { return self::getData($name, $_POST, $filter, $default); } @@ -47,7 +47,7 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function put($name = '', $default = null, $filter = '') + public static function put($name = '', $default = null, $filter = null) { static $_PUT = null; if (is_null($_PUT)) { @@ -63,7 +63,7 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function param($name = '', $default = null, $filter = '') + public static function param($name = '', $default = null, $filter = null) { switch ($_SERVER['REQUEST_METHOD']) { case 'POST': @@ -85,7 +85,7 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function request($name = '', $default = null, $filter = '') + public static function request($name = '', $default = null, $filter = null) { return self::getData($name, $_REQUEST, $filter, $default); } @@ -97,7 +97,7 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function session($name = '', $default = null, $filter = '') + public static function session($name = '', $default = null, $filter = null) { return self::getData($name, $_SESSION, $filter, $default); } @@ -109,7 +109,7 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function cookie($name = '', $default = null, $filter = '') + public static function cookie($name = '', $default = null, $filter = null) { return self::getData($name, $_COOKIE, $filter, $default); } @@ -121,7 +121,7 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function server($name = '', $default = null, $filter = '') + public static function server($name = '', $default = null, $filter = null) { return self::getData(strtoupper($name), $_SERVER, $filter, $default); } @@ -133,7 +133,7 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function globals($name = '', $default = null, $filter = '') + public static function globals($name = '', $default = null, $filter = null) { return self::getData($name, $GLOBALS, $filter, $default); } @@ -145,86 +145,72 @@ class Input * @param string $filter 过滤方法 * @return mixed */ - public static function env($name = '', $default = null, $filter = '') + public static function env($name = '', $default = null, $filter = null) { return self::getData(strtoupper($name), $_ENV, $filter, $default); } /** * 获取系统变量 支持过滤和默认值 - * @param $name - * @param $input - * @param $filter - * @param $default + * @param string $name + * @param array $input + * @param mixed $filter + * @param mixed $default * @return mixed */ - public static function getData($name, $input, $filter = '', $default = null) + public static function getData($name, $input = [], $filter = null, $default = null) { - // 解析name - list($name, $type) = static::parseName($name); // 解析过滤器 - $filters = static::parseFilters($filter); - // 解析值 - if ('' === $name) { - // 过滤所有输入 - $data = $input; - // 对数组应用过滤器 - foreach ($filters as $filter) { - $data = self::filter($filter, $data); - } - // 递归过滤表达式 - array_walk_recursive($data, 'self::filterExp'); - // 返回结果 - return $data; - } elseif (isset($input[$name])) { - // 过滤name指定的输入 - $data = $input[$name]; - } else { - // 无输入数据, 下面直接返回默认值 - return $default; - } - - // 强制类型转换 - $data = static::typeCast($data, $type); - - // 正则过滤 - $regex = static::regexFilter($data, $filter); - if (false === $regex) { - // 过滤器是正则表达式, 但数据无匹配 - // 返回默认值 + $filters = static::parseFilter($filter); + // 为方便传参把默认值附加在过滤器后面 + $filters[] = $default; + if (!is_array($input)) { $data = $default; - } elseif (!is_null($regex)) { - // 数据合法,对结果进行强类型转换 - $data = static::typeCast($regex, $type); + } elseif (empty($name)) { + $data = $input; + array_walk_recursive($data, 'self::filter', $filters); } else { - // 假如值为数组 - if (is_array($data)) { - // 递归过滤表达式 - array_walk_recursive($data, 'self::filterExp'); - } - foreach ($filters as $filter) { - if (is_callable($filter)) { - $data = is_array($data) ? self::filter($filter, $data) : call_user_func($filter, $data); // 参数过滤 + // 解析name + list($name, $type) = static::parseName($name); + if (isset($input[$name])) { + // 过滤name指定的输入 + $data = $input[$name]; + if (is_array($data)) { + array_walk_recursive($data, 'self::filter', $filters); } else { - // filter函数不存在时, 则使用filter_var进行过滤 - // filter为非整形值时, 调用filter_id取得过滤id - $data = filter_var($data, is_int($filter) ? $filter : filter_id($filter)); - if (false === $data) { - // 不通过过滤器则返回默认值 - return $default; - } + self::filter($data, $name, $filters); } + if ($data !== $default) { + // 强制类型转换 + static::typeCast($data, $type); + } + } else { + // 无输入数据 + $data = $default; } } return $data; } + /** + * 设置默认的过滤函数 + * @param string|array $name + * @return array + */ + public static function setFilter($name) + { + if (is_string($name)) { + $name = explode(',', $name); + } + static::$filters = $name; + } + /** * 过滤表单中的表达式 - * @param string &$value + * @param string $value * @return void */ - public static function filterExp(&$value) + protected static function filterExp(&$value) { // TODO 其他安全过滤 @@ -236,17 +222,43 @@ class Input /** * 递归过滤给定的值 - * @param string $filter - * @param mixed $data + * @param mixed $value 键值 + * @param mixed $key 键名 + * @param array $filters 过滤方法+默认值 * @return mixed */ - public static function filter($filter, $data) + private static function filter(&$value, $key, $filters) { - $result = []; - foreach ($data as $key => $val) { - $result[$key] = is_array($val) ? self::filter($filter, $val) : call_user_func($filter, $val); + if (!empty($value)) { + // 分离出默认值 + $default = array_pop($filters); + foreach ($filters as $filter) { + if (is_callable($filter)) { + // 调用函数过滤 + $value = call_user_func($filter, $value); + } else { + $begin = substr($filter, 0, 1); + if (in_array($begin, ['/','#','~']) && $begin == $end = substr($filter, -1)) { + // 正则过滤 + if (!preg_match($filter, $value)) { + // 匹配不成功返回默认值 + $value = $default; + break; + } + } else { + // filter函数不存在时, 则使用filter_var进行过滤 + // filter为非整形值时, 调用filter_id取得过滤id + $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter)); + if (false === $value) { + // 不通过过滤器则返回默认值 + $value = $default; + break; + } + } + } + } + self::filterExp($value); } - return $result; } /** @@ -261,55 +273,55 @@ class Input /** * 解析过滤器 - * @param mixed $filters + * @param mixed $filter * @return array */ - private static function parseFilters($filters) + private static function parseFilter($filter) { - $filters = ('' === $filters) ? static::$filter : $filters; - - if (empty($filters)) { + if (is_null($filter)) { + $result = self::getFilter(); + } elseif (empty($filter)) { $result = []; - } elseif (is_string($filters)) { - $result = explode(',', $filters); - } elseif (is_array($filters)) { - $result = $filters; } else { - $result = [$filters]; + if (is_array($filter)) { + $result = $filter; + } elseif (is_string($filter) && strpos($filter, ',')) { + $result = explode(',', $filter); + } else { + $result = [$filter]; + } + // 如果最后一项为0或false,表示覆盖默认的过滤函数,否则为叠加 + if (!end($result)) { + array_pop($result); + } else { + $result = array_merge(self::getFilter(), array_diff($result, self::getFilter())); + } } return $result; } /** - * 正则过滤 - * @param string $input - * @param string $filter - * @return string|false + * 获取过滤方法 + * @return array */ - private static function regexFilter($input, $filter) + private static function getFilter() { - if (empty($filter) || is_array($input)) { - return null; + if (is_null(static::$filters)) { + // 从配置项中读取 + $filters = \think\Config::get('default_filter'); + static::$filters = empty($filters) ? [] : (is_array($filters) ? $filters : explode(',', $filters)); } - $begin = $filter[0]; - $end = $filter[strlen($filter) - 1]; - if ( - ('/' === $begin && '/' === $end) || - ('#' === $begin && '#' === $end) || - ('~' === $begin && '~' === $end) - ) { - return !preg_match($filter, $input) ? false : $input; - } - return null; + return static::$filters; } + /** * 强类型转换 * @param string $data * @param string $type * @return mixed */ - private static function typeCast($data, $type) + private static function typeCast(&$data, $type) { switch (strtolower($type)) { // 数组 @@ -333,6 +345,5 @@ class Input default: $data = (string) $data; } - return $data; } }