加入收藏 | 设为首页 | 会员中心 | 我要投稿 怀化站长网 (https://www.0745zz.cn/)- 语音技术、云资源管理、物联设备、云计算、决策智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php表单敏感字符过滤类

发布时间:2022-06-22 08:46:54 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了php表单敏感字符过滤类及其用法实例,详细分析了表单生成与提交等环节针对敏感字符的过滤功能,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了php表单敏感字符过滤类及其用法。分享给大家供大家参考。具体分析如下: /** * 表单生成
  这篇文章主要介绍了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 = "
  {$title}
  ";
                          // js错误提示
                          $dd = "J{$name}">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  "text" name="{$name}" value="{$value}" {$style}/>";
                                  break;
                          case 'password':
                                  //密码输入
                                  return "password" name="{$name}" {$style}/>";
                                  break;
                          case '':
                                  //多行文本
                                  return "{$name}" {$style}/>{$value}";
                                  break;
                          case 'hidden':
                                  // 隐藏
                                  return "hidden" name="{$name}" value="{$value}" {$style}/>";
                                  break;
                          case 'file':
                                  // 文件上传
                                  return "file"name="{$name}" {$style}/>";
                                  break;
                          case 'submit':
                                  // 提交
                                  return "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("%s"/>%srn"
                                                  ,$select,preg_replace("/Y_/i",'',$varl),$_title);
                                                  break;
                                          case 'radio':
                                                  if('Y' == $select)$select = 'checked';
                                                  $outform .= sprintf("%sradio" name="%s" value="%s" %s/>rn",
                                                  $_title,$select,$name,$varl,$style);
                                                  break;
                                          case 'checkbox':
                                                  if('Y' == $select)$select = 'checked';
                                                  $outform .= sprintf("%scheckbox" name="%s[]" value="%s" %s/>rn",$_title,$select,$name,$varl,$style);
                                                  break;
                                  }
                                  $select =null;
                          }
                  }
                  // 下拉选择
                  if($type =='select')$outform = sprintf('%s',$name,$style,$outform);
                  return sprintf("
  %s
  %sJ%s">
  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); //将回车替换为
   
                  $str=htmlspecialchars($str); //将特殊字元转成 HTML 格式。
                  //$str=str_replace(array(" ",'
                  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 "
  ";
          print_r($past);
          echo"";
  }
  echo ';
  echo $_form->formHtml($form['login'],$dd);
  echo '';
 

(编辑:怀化站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读