美文网首页程序员
参数过滤参考

参数过滤参考

作者: CbdFocus | 来源:发表于2016-04-14 16:59 被阅读64次

源码摘自 ThinkPHP/Common/functions.php
对应手册 http://www.kancloud.cn/manual/thinkphp/1721

function I($name,$default='',$filter=null,$datas=null) {
    static $_PUT    =   null;
    if(strpos($name,'/')){ // 指定修饰符
        list($name,$type)   =   explode('/',$name,2);
    }elseif(C('VAR_AUTO_STRING')){ // 默认强制转换为字符串
        $type   =   's';
    }
    if(strpos($name,'.')) { // 指定参数来源
        list($method,$name) =   explode('.',$name,2);
    }else{ // 默认为自动判断
        $method =   'param';
    }
    switch(strtolower($method)) {
        case 'get'     :   
            $input =& $_GET;
            break;
        case 'post'    :   
            $input =& $_POST;
            break;
        case 'put'     :   
            if(is_null($_PUT)){
                parse_str(file_get_contents('php://input'), $_PUT);
            }
            $input  =   $_PUT;        
            break;
        case 'param'   :
            switch($_SERVER['REQUEST_METHOD']) {
                case 'POST':
                    $input  =  $_POST;
                    break;
                case 'PUT':
                    if(is_null($_PUT)){
                        parse_str(file_get_contents('php://input'), $_PUT);
                    }
                    $input  =   $_PUT;
                    break;
                default:
                    $input  =  $_GET;
            }
            break;
        case 'path'    :   
            $input  =   array();
            if(!empty($_SERVER['PATH_INFO'])){
                $depr   =   C('URL_PATHINFO_DEPR');
                $input  =   explode($depr,trim($_SERVER['PATH_INFO'],$depr));            
            }
            break;
        case 'request' :   
            $input =& $_REQUEST;   
            break;
        case 'session' :   
            $input =& $_SESSION;   
            break;
        case 'cookie'  :   
            $input =& $_COOKIE;    
            break;
        case 'server'  :   
            $input =& $_SERVER;    
            break;
        case 'globals' :   
            $input =& $GLOBALS;    
            break;
        case 'data'    :   
            $input =& $datas;      
            break;
        default:
            return null;
    }
    if(''==$name) { // 获取全部变量
        $data       =   $input;
        $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
        if($filters) {
            if(is_string($filters)){
                $filters    =   explode(',',$filters);
            }
            foreach($filters as $filter){
                $data   =   array_map_recursive($filter,$data); // 参数过滤
            }
        }
    }elseif(isset($input[$name])) { // 取值操作
        $data       =   $input[$name];
        $filters    =   isset($filter)?$filter:C('DEFAULT_FILTER');
        if($filters) {
            if(is_string($filters)){
                if(0 === strpos($filters,'/')){
                    if(1 !== preg_match($filters,(string)$data)){
                        // 支持正则验证
                        return   isset($default) ? $default : null;
                    }
                }else{
                    $filters    =   explode(',',$filters);                    
                }
            }elseif(is_int($filters)){
                $filters    =   array($filters);
            }
            
            if(is_array($filters)){
                foreach($filters as $filter){
                    if(function_exists($filter)) {
                        $data   =   is_array($data) ? array_map_recursive($filter,$data) : $filter($data); // 参数过滤
                    }else{
                        $data   =   filter_var($data,is_int($filter) ? $filter : filter_id($filter));
                        if(false === $data) {
                            return   isset($default) ? $default : null;
                        }
                    }
                }
            }
        }
        if(!empty($type)){
            switch(strtolower($type)){
                case 'a':   // 数组
                    $data   =   (array)$data;
                    break;
                case 'd':   // 数字
                    $data   =   (int)$data;
                    break;
                case 'f':   // 浮点
                    $data   =   (float)$data;
                    break;
                case 'b':   // 布尔
                    $data   =   (boolean)$data;
                    break;
                case 's':   // 字符串
                default:
                    $data   =   (string)$data;
            }
        }
    }else{ // 变量默认值
        $data       =    isset($default)?$default:null;
    }
    is_array($data) && array_walk_recursive($data,'think_filter');
    return $data;
}

function array_map_recursive($filter, $data) {
    $result = array();
    foreach ($data as $key => $val) {
        $result[$key] = is_array($val)
         ? array_map_recursive($filter, $val)
         : call_user_func($filter, $val);
    }
    return $result;
 }

相关文章

  • 参数过滤参考

    源码摘自 ThinkPHP/Common/functions.php对应手册 http://www.kanclou...

  • Java的Filter过滤器

    1.过滤器创建 了解过滤器常见配置含义 filter-mapping标签里面还有许多参数,可以参考学习博客特别注意...

  • controller返回null值

    spring controller会将放回参数中null值默认不放回,主要是json转换时被过滤所致;可参考如下设...

  • linux 之 grep 常用参数介绍

    grep 命令 过滤 显示要过滤的内容信息 配合Linux正则表达式使用 grep参数介绍: 常用参数如下

  • vue基础(自定义局部与全局过滤器)

    创建局部自定义过滤器 定义位置局部自定义过滤器需要在filters结构中定义 语法 参数 过滤器有一个默认的参数,...

  • 2018-09-27sql模板参数介绍

    模板参数是指适用于当前模板的参数,需要与过滤条件结合使用,即数据集取出所有的数据,数据扩展的时候使用模板参数过滤出...

  • 内置函数

    一:filter函数:过滤器 1-1:函数使用 参数1:过滤规则函数参数2:可迭代对象 二:map函数:将函数应用...

  • lodash源码阅读 —— difference

    lodash 源码阅读 —— difference 该方法是用于过滤,第一个参数是需要过滤的数组,第二个参数是需要...

  • typescript语法

    参考:typescript参考1 typescript参考2 函数参数类型定义 声明函数参数默认值 ...

  • vue过滤器过滤时间全局过滤器和局部过滤器

    1全局过滤器 Vue.filter有两个参数一个是过滤器名字一个是过滤器处理函数,函数中第一个参数是默认要过滤的数...

网友评论

    本文标题:参数过滤参考

    本文链接:https://www.haomeiwen.com/subject/lbiglttx.html