php表单敏感字符过滤类

本文实例讲述了php表单敏感字符过滤类及其用法。分享给大家供大家参考。具体分析如下:

/**

* 表单生成验证文件

*/

$_form = new formHtmlFind();

class formHtmlFind{

        /**

         * 输出表单函数

         * $formKey  表单键

         * $infoArray 更新时的原始信息数组

         */

 

        public function formHtml($array,$infoArray='')

        {

                // 检测数组是否存在

                if(emptyempty($array))return false;

                $newform = null;

                // 信息数组(更新信息)

                $this->infoArray = !emptyempty($infoArray)?$infoArray:array();

                $this->array['class'] =  get_class_methods(get_class());

                foreach ($array as $key =>$arr)

                {

                        // 键值转换为纯英文

                        $key = preg_replace("/[^a-z]/i",'',$key);

                        // 生成表单

                        $newform .= $this->outputForm($arr,$key);

                }

                // 输出表单

                return $newform.$this->jsError();

        }

        /**

         * 生成表单函数

         */

        private function outputForm($arr,$key)

        {

                $value = null;

                if(emptyempty($arr))return false;

                // input Type

                $type   = $key;

                // input NAME

                $name   = trim($arr[0]);

                // input 初始值 不包含多选,单选类

                $value  = (!emptyempty($this->infoArray[$name]))? trim($this->infoArray[$name]):trim($arr[1]);

                $value  = emptyempty($this->post[$name])? $value :trim($this->post[$name]);

                // input Title

                $title  = trim($arr[2]);

                // 样式

                $style  = trim($arr[3]);

                if($key!=="hidden")

                {

                        $dt = "<dt>{$title}</dt><dd>";

                        // js错误提示

                        $dd = "<tt id="J{$name}"></tt></dd>rn";

                }

                return (!preg_match("/checkbox|select|radio/i",$key))?

                $dt.$this->newInput($type,$name,$value,$style,$title).$dd:

                $this->formSelect($type,$name,$arr[1],$title,$style); // 多选类

        }

        /**

         * 提交数据检测

         */

        public function postForm($array)

        {

                // 检测数组是否存在

                if(emptyempty($array)||emptyempty($_POST))return false;

                $this->post           =  $_POST;

                $this->array['class'] =  get_class_methods(get_class());

                foreach ($array as $key =>$arr)

                {

                        // 键值转换为纯英文

                        $key = preg_replace("/[^a-z]/i",'',$key);

                        // 检测 注销file类表单

                        if (!emptyempty($arr)&&'file' != $key)$newData[trim($arr[0])] = $this->postFind($arr,$key);

                }

                // 输出表单

                if(!emptyempty($this->error))

                {

                        return false;

                }

                else return $newData;

        }

        /**

         * 生成表单

         */

        private function newInput($type,$name,$value,$style,$title)

        {

                switch ($type)

                {

                        case 'text':

                                // 单行文本

                                return  "<input type="text" name="{$name}" value="{$value}" {$style}/>";

                                break;

                        case 'password':

                                //密码输入

                                return "<input type="password" name="{$name}" {$style}/>";

                                break;

                        case '':

                                //多行文本

                                return "<textarea name="{$name}" {$style}/>{$value}</textarea>";

                                break;

                        case 'hidden':

                                // 隐藏

                                return "<input type="hidden" name="{$name}" value="{$value}" {$style}/>";

                                break;

                        case 'file':

                                // 文件上传

                                return "<input type= "file"name="{$name}" {$style}/>";

                                break;

                        case 'submit':

                                // 提交

                                return "<input type="submit" name="{$name}" value="$value" $style}/>";

                                break;

                        default:

                                return "{$type}类型错误!!!";

                                break;

                }

        }

        /**

         * 提交信息检测

         * 错误返回error

         */

        private function postFind($arr,$key)

        {

                if(emptyempty($arr))return false;

                $name = $title =$error =$find =$standard =null;

                // input NAME

                $name     = trim($arr[0]);

                // input Title

                $title    = trim($arr[2]);

                // 错误提示

                $error    = trim($arr[4]);

                // 检测类型 Y N

                $find     = trim($arr[5]);

                // 检测标准

                $standard = trim($arr[6]);

                //

                if(!emptyempty($standard))$this->error .=$this->ck_split($standard,$name,$title,$find,$error);

                // 转换为字符串

                if(is_array($this->post[$name]))$this->post[$name] = implode(",",$this->post[$name]);

                // 转义或其他转化

                $KKarray = array();

                if(preg_match("/Y|N/is",$find))

                {

                        $KKarray       = split("_", $find);

                        // 转义或过滤

                        $escape_filter = (!emptyempty($KKarray[1]))?'ck_'.$KKarray[1]:'';

                        // 输出通过检测的合法数据

                        $data          = ($escape_filter)?$this->$escape_filter($this->post[$name]):$this->post[$name];

 

                }

                else  $data        = "";

                // 输出新的数据

                return $data;

        }

        /**

         * 多选类表单生成

         */

        private function formSelect($type,$name,$value,$title,$style)

        {

                $outform = null;

                // 触发更新和提交动作时的初始

                $nowvalue = (!emptyempty($this->post[$name]))?$this->post[$name]:$this->infoarray[$name];

                // 兼容多选的识别,转为数组

                if(!emptyempty($nowvalue))$valueArray = explode(",",$nowvalue);

                // 选项标题

                if(is_array($title))

                {

                        array_unshift($title,'选择');

                        $titarray = array_values($title);

                }else $titarray = explode("|",$title);

                // 选项值

                if(is_array($value))

                {

                        array_unshift($value,'选择');

                        $valarray  = array_keys($value);

                        if(emptyempty($title))$titarray = array_values($value);

                }

                else $valarray = explode("|",$value);

                // 取消表单的初始默认值

                if(!emptyempty($this->post)&&!emptyempty($this->infoArray))$value = preg_replace("/Y_/i",'',$value);

 

                foreach ($valarray as $key =>$varl)

                {

                        // 非默认的识别

                        if(!emptyempty($valueArray))$select   = (in_array($varl,$valueArray))?'Y':'';

                        //  判断是否为默认

                        else $select   = (eregi("Y_",$varl))? 'Y':'';

 

                        if($key >'0')

                        {

                                $_title=($titarray[$key])? $titarray[$key]:$title;

                                switch ($type)

                                {

                                        case 'select':

                                                if('Y' == $select)$select = 'selected';

                                                $outform .=        sprintf("<option %s value="%s"/>%s</option>rn"

                                                ,$select,preg_replace("/Y_/i",'',$varl),$_title);

                                                break;

                                        case 'radio':

                                                if('Y' == $select)$select = 'checked';

                                                $outform .= sprintf("<label>%s<input %s type="radio" name="%s" value="%s" %s/></label>rn",

                                                $_title,$select,$name,$varl,$style);

                                                break;

                                        case 'checkbox':

                                                if('Y' == $select)$select = 'checked';

                                                $outform .= sprintf("<label>%s<input %s type="checkbox" name="%s[]" value="%s" %s/></label>rn",$_title,$select,$name,$varl,$style);

                                                break;

                                }

                                $select =null;

                        }

                }

                // 下拉选择

                if($type =='select')$outform = sprintf('<select name="%s" %s>%s</select>',$name,$style,$outform);

                return sprintf("<dt>%s</dt><dd>%s<tt id="J%s"></tt></dd>rn",$titarray[0],$outform,$name);

        }

        /**

         * 表单验证 及全部 ck_类函数

         */

        private function ck_split($standard,$name,$title,$find,$error)

        {

                //  非必填缺省跳过

                if(eregi('N',$find) && emptyempty($this->post[$name]))return false;

                // 必填缺省检测

                if(eregi('Y',$find) && emptyempty($this->post[$name]))return "["J{$name}","$error"],";

                $t_error = null;

                // 多项检测

                $arr = explode(',',$standard);

                // POST数据检测

                if(!emptyempty($arr))foreach ($arr as $var)

                {

                        if(trim($var)!='')

                        {

                                switch ($this->post)

                                {

                                        case is_array($this->post[$name]):

                                                // 数组类的检测

                                                foreach ($this->post[$name] as $_var)

                                                {

                                                        $t_error.= ($this->ck_open($_var,trim($var)))?"":$error;

                                                        if($t_error)break;

                                                }

                                                break;

                                        default:

                                                $t_error.= ($this->ck_open($this->post[$name],trim($var)))?"":$error;

                                                break;

                                }

                                if($t_error)break;

                        }

                }

                return ($t_error)? "["J{$name}","$t_error"],":"";

        }

        // 函数调用

        private function ck_open($string,$str)

        {

                $functi = $this->ck_detected($str);

                return ($this->$functi($string,$str))? true:false;

        }

        // 类型判断

        private function ck_detected($str)

        {

                $detect = (eregi("^[a-zA-Z]*$",$str))? "{$str}Detect":'lengthDetect';

                if(!in_array($detect,$this->array['class']))

                {

                        location('index.php',$ck,' Lack of function !!!');

                }

                return $detect;

        }

        //-------------------------------------以下为检测函数可外部调用

        // 长度

        public function lengthDetect($string,$str){

                $len = split('-',trim($str));

                return (strlen($string) > ($len[0]-1) && strlen($string) < ($len[1]+1))? true:false;

        }

        // 价格

        public function moneyDetect($str){

                return preg_match("/^(-|+)?d+(.d+)?$/",$str);

        }

        // 邮件

        public function emailDetect($str){

                return preg_match("/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/", $str);

        }

        // 网址

        public function urlDetect($str){

                return preg_match("/^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>"])*$/", $str);

        }

        // 数字型

        public function numDetect($str){

                return is_numeric($str);

        }

        // 中文

        public function cnDetect($str){

                return preg_match("/^[x7f-xff]+$/", $str);

        }

        // 字母

        public function enDetect($str){

                return preg_match("/^[A-Za-z]+$/", $str);

        }

        // 数字字母混合

        public function numenDetect($str){

                return preg_match("/^([a-zA-Z0-9_-])+$/",$str);

        }

        // 电话号码

        public function telDetect($str){

                return ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $str);

        }

        // 敏感词

        public function keyDetect($str){

                return (!preg_match("/$badkey/i",$str));

        }

        //-----------------------------------------------------输出

        // 字符替换

        public function ck_filter($str){

                $str=(is_array($str))? implode(",",$str):$str;

                $str=nl2br($str); //将回车替换为<br>

                $str=htmlspecialchars($str); //将特殊字元转成 HTML 格式。

                //$str=str_replace(array(" ",'<? '),array(" ",'< ?'),$str); //替换空格替换为

                return $str;

        }

        // 转义

        function ck_escape($str)

        {

                if (!get_magic_quotes_gpc())return addslashes($str);

                return $str;

        }

        // MD5加密

        public function ck_md5($str){

                return  MD5($str);

        }

        // base64加密

        public function ck_base64($str){

                return  base64_encode($str);

        }

        // 时间

        function ck_time($str){

                // time_r() 来在公用函数文件

                if(!is_numeric($str))

                {

                        return time_r($str);

                }

                else return $str;

        }

        // 有条件注销(数字)

        public function ck_cancel($str){

                return (!is_numeric($str))? $str:"";

        }

        // 无条件注销

        public function ck_delete(){

                return null;

        }

        // js错误提示

        private function jsError()

        {

                if(emptyempty($this->error))return false;

                return  "

                <script  language=javascript> rn var error = new Array(".trim($this->error,',').");

                        rn for (i=0; i < error.length; i++){

                        rn document.getElementById(error[0]).innerHTML=error[1];

                         }rn </script>

                ";

        }

}

 

// 演示:

$form[1] =array(

'text'=>array('title','','产品名称','size=40','产品名称不可缺少!','Y','cn,1-30'),

'text1'=>array('categories','','产品名称','','','Y_base64'),

'select'=>array('superiors','||1|2|Y_3','产品类别|选择|1|2|3','','必选项','Y'),

'radio'=>array('superiors1','|1|Y_2|3','产品xun|产品1|产品2|产品3','','必选项','Y'),

'checkbox'=>array('superiors2',array(1=>'11',2=>'22',3=>'33'),'','','必选项','Y'),

'file'=>array('ddd','','文件'),

);

$form =array (

  'login' => 

  array (

    'text' => 

    array (

      0 => 'user',

      1 => '',

      2 => '用户名',

      3 => 'size=20',

      4 => '!',

      5 => 'Y',

      6 => 'numen,6-12',

    ),

    'password' => 

    array (

      0 => 'pass',

      1 => '',

      2 => '密 码',

      3 => 'size=22',

      4 => '密码格式错误!',

      5 => 'Y_md5',

      6 => 'numen,6-12',

    ),

    'radio' => 

    array (

      0 => 'time',

      1 => '|7200|3600|1800',

      2 => 'cookies有效时间|2小时|1小时|30分钟',

      3 => '',

      4 => '',

      5 => 'N_delete',

      6 => '',

    ),

  ),

  );

 

// 表单提交效验

$past = $_form->postForm($form['login']);

$dd = array('title'=>'标题','categories'=>'类别');

// $dd 为已有的信息(如更新时的信息输出) POST数据位内部处理具有优先权

if(!emptyempty($past))

{

        echo "<pre>";

        print_r($past);

        echo"</pre>";

}

echo '<form method="POST" NAME="PostTopic" action="" enctype="multipart/form-data" style="margin:0px;">';

echo $_form->formHtml($form['login'],$dd);

echo '<input type="submit" value="Y" name="B1"></form>';

希望本文所述对大家的PHP程序设计有所帮助。

以上是 php表单敏感字符过滤类 的全部内容, 来源链接: utcz.com/z/315496.html

回到顶部