php 表单验证类
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>表单验证测试</title> </head> <body> <h2>简易表单验证!</h2> <div class="help" style="font-size:12px;color:grey">下面的例子已经够清楚了,如果需要自定义验证类型或者自定义验证表达式可以自定义函数:validate_myfun(需要验证的值,规则数组)<br />自定义表达式:_erun_myfun(要验证的值,规则数组,表达式数组)</div> <div class="info" style="padding:10px;background:#ffc"> <?php function validate_testa($value,$args){ if($value%2 == 0){ return array(false,$args['cname'].'输入错误,只能输入奇数!'); }else{ return array(true,null); } } function _erun_testb($value,$args,$t){ if($value >= $t['setting']){ return array(false,$args['cname'].'只能输入小于'.$t['setting'].'的数!'); }else{ return array(true,null); } } /*以上是自定义函数和自定义表达式*/ if($_GET['action'] == 'post'){ require('include/Validator.php'); $validate_str = $_POST['valstr']; unset($_POST['valstr']); $val = new Validator(); $break = isset($_POST['break'])?true:false; if($val->validate($_POST,$validate_str,$break)){ echo "提交成功!"; }else{ echo "<h4>提交失败</h4>"; if($break){ echo $val->getMsg(); }else{ echo "<ul>"; foreach($val->getMsg() as $msg){ echo "<li>".$msg."</li>"; } echo "</ul>"; } } } ?> </div> <div id="form"> <form action="test.php?action=post" method="post" style="line-height:2;"> 标 题 : <input type="text" name="title" value="<?=$_POST['title']?>" /> *<br /> 密 码 : <input type="password" name="password" value="<?=$_POST['password']?>" /> *<br /> 确认密码 : <input type="password" name="passagain" value="<?=$_POST['passagain']?>" /> *<br /> 您的年龄 : <input type="text" name="age" value="<?=$_POST['age']?>" /><br /> 您的生日 : <input type="text" name="birth" value="<?=$_POST['birth']?>" /><br /> 自定义 : <input type="text" name="a" value="<?=$_POST['a']?>" /><br /> 验证字串 : <textarea name="valstr" cols="80" rows="10">title|标题|string|require=请务必填写标题|length(5:30)=标题长度不正确 password|密码|alnumu|require|length(6:)=密码不得少于6位 passagain|确认密码|alnumu|require|equal(password) age|年龄|int=年龄必须为整数哦!||size(18:100) birth|生日|time||time_format(Y-m-d) a|测试类型|testa||testb(10)</textarea><br /> <input name="break" type="checkbox" value="1" /> 只显示单个错误<br /> <input type="submit" value="提交" name="submit" /> </form> </div> </body> </html> <?php /** * * Created By Baoling * Date: 2009-07-13 * Contact: baoling@yeah.net / QQ:110042869 * Blog: blog.meiu.cn * * 目前支持以下验证类型 注意验证的提示信息中不能含有空格、换行和竖线和等号空格用{SP}代替,换行用{LF}代替,竖线用{VE} * string 字符, * time 时间日期, * alnum 字母加数字, * alpha 字母, * alnumu 字母数字下划线, * digits 数字, * graph 可显示的字符, * lower 小写, * print 可否打印, * punct 标点, * whitespace 空格或制表符, * upper 大写, * int 整型, * float 浮点型, * ipv4 ip地址, * binary 二进制数, * domain 域名, * email Email * * 要验证的数组的key | 中文名称 | 验证类型 | 是否必须 | 其他(equal length size format) * title|标题|string=格式不正确|require=必须要填写|length(22:32)=长度不正确 * age|年龄|int|require|size(1:200) equal(addtime) * addtime|时间|time|require|time_format(Y-m-d) * ipaddr|IP地址|ipv4|require| * email|email地址|email|require| * password|密码|string|require|equal(title) * a|测试a|float|require|length(0:199.99) * b|测试b|binary|require| * c|测试c|binary|| * */ //清除数组内各个值的前后空格 function trimArray($Input){ if (!is_array($Input)) return trim($Input); return array_map('trimArray', $Input); } class Validator{ var $_locale = null; var $break = false; var $pass = true; var $errmsg = array(); var $arr = array(); function validate($arr,$rule_str,$break = null){ if($break !== null){ $this->break = $break; } $this->arr = $arr; if(trim($rule_str) == ''){ exit('Validate rules can\'t be empty!'); } $rule_str = str_replace("r",'',trim($rule_str)); $rule_arr = explode("n",$rule_str); foreach($rule_arr as $rule){ if(!$this->_complier_rule($rule) && $this->break == true){ return false; } } return $this->pass; } /** * 解析每条规则并验证 */ function _complier_rule($rule){ $rule = trim($rule); if($rule == ''){ exit('Validate rules can\'t be empty!'); }else{ $ruleargs = trimArray(explode('|',$rule)); $args = array( 'field' => $ruleargs[0], 'cname' => $ruleargs[1], 'type' => $ruleargs[2], 'require' => $ruleargs[3], 'expression' => $ruleargs[4] ); unset($ruleargs); if($this->_validate_require($args)){ //验证字段是否填写 $tpos = strpos($args['type'],'='); if($tpos){ $func_name = 'validate_'.substr($args['type'],0,$tpos); $error_title = substr($args['type'],$tpos+1,strlen($args['type'])); }else{ $func_name = 'validate_'.$args['type']; $error_title = null; } if(method_exists($this,$func_name)){ $return = $this->{$func_name}($this->arr[$args['field']],$args,$error_title); }else{ if(function_exists($func_name)){ list($return,$msg) = call_user_func($func_name,$this->arr[$args['field']],$args); if(!$return){ if($tpos){ $this->_setMsg($args['field'],null,$error_title); }else{ $this->_setMsg($args['field'],$args['cname'],$msg); } } }else{ exit('The validator function doesn\'t exist!'); } } if(!$return){ $this->pass = false; } //验证表达式 $this->_expressions($args); } return $this->pass; } } /** * 验证必填字段 */ function _validate_require($args){ if( array_key_exists($args['field'],$this->arr) ){ if(strncasecmp($args['require'],'require',7) == 0 && $this->arr[$args['field']] == ''){ if($mpos = strpos($args['require'],'=')){ $this->_setMsg($args['field'],null,substr($args['require'],$mpos+1,strlen($args['require']))); }else{ $this->_setMsg($args['field'],$args['cname'],'不能为空!'); } $this->pass = false; return false; }elseif($this->arr[$args['field']] != ''){ return true; }else{ return false; } }elseif(strncasecmp($args['require'],'require',7) == 0){ if($mpos = strpos($args['require'],'=')){ $this->_setMsg($args['field'],null,substr($args['require'],$mpos+1,strlen($args['require']))); }else{ $this->_setMsg($args['field'],$args['cname'],'不能为空!'); } $this->pass = false; return false; }else{ return false; } } /** * 验证表达式 */ function _expressions($args){ if(preg_match_all('/([a-zA-Z0-9_-]+)(([^(]+))=?([^\s]*)/',$args['expression'],$t)){ foreach($t[0] as $k=>$v){ if($t[1][$k] != 'time_format'){ $tt = array('expression'=>$t[1][$k],'setting'=>$t[2][$k],'title'=>$t[3][$k]); $equal_func = "_erun_".$t[1][$k]; if(method_exists($this,$equal_func)){ $this->{$equal_func}($args,$tt); }else{ if(function_exists($equal_func)){ list($return,$msg) = call_user_func($equal_func,$this->arr[$args['field']],$args,$tt); }else{ exit('The validator expression function doesn\'t exist!'); } if(!$return){ $this->pass = false; if(!empty($tt['title'])){ $this->_setMsg($args['field'],null,$tt['title']); }else{ $this->_setMsg($args['field'],$args['cname'],$msg); } } } } } } } //表达式equal判断与某个字段是否相等 function _erun_equal($args,$t){ if($this->arr[$args['field']] != $this->arr[$t['setting']]){ $this->pass = false; if(!empty($t['title'])){ $this->_setMsg($args['field'],null,$t['title']); }else{ $this->_setMsg($args['field'],$args['cname'],'不一致!'); } } } //表达式length,判断字符长度 function _erun_length($args,$t){ if(strpos($t['setting'], ':') !== false){ $length_rule = explode(':',$t['setting']); $length = strlen($this->arr[$args['field']]); if($length_rule[0] == '' && $length > $length_rule[1]){ $this->pass = false; $title = sprintf("大于 %s 字符的限制!",$length_rule[1]); } if($length_rule[1] == '' && $length < $length_rule[0]){ $this->pass = false; $title = sprintf("不得小于 %s 字符!",$length_rule[0]); } if($length_rule[0] != '' && $length_rule[1] != '' && ($length < $length_rule[0] || $length > $length_rule[1])){ $this->pass = false; $title = sprintf("必须介于 %s 和 %s 字符之间!",$length_rule[0],$length_rule[1]); } if(isset($title)){ if(!empty($t['title'])){ $this->_setMsg($args['field'],null,$t['title']); }else{ $this->_setMsg($args['field'],$args['cname'],$title); } } } } //表达式size,验证数字型的大小,支持digits,int和float function _erun_size($args,$t){ if(strpos($t['setting'], ':') !== false && preg_match('/^(digits|int|float)/i',$args['type'])){ $size_rule = explode(':',$t['setting']); $num = $this->arr[$args['field']]; if($size_rule[0] == '' && $num > $size_rule[1]){ $this->pass = false; $title = sprintf("不得大于 %s!",$size_rule[1]); } if($size_rule[1] == '' && $num < $size_rule[0]){ $this->pass = false; $title = sprintf("不得小于 %s!",$size_rule[0]); } if($size_rule[0] != '' && $size_rule[1] != '' && ($num < $size_rule[0] || $num > $size_rule[1])){ $this->pass = false; $title = sprintf("必须在 %s 和 %s 之间!",$size_rule[0],$size_rule[1]); } if(isset($title)){ if(!empty($t['title'])){ $this->_setMsg($args['field'],null,$t['title']); }else{ $this->_setMsg($args['field'],$args['cname'],$title); } } } } function getMsg(){ if($this->break){ if(is_array($this->errmsg)) return end($this->errmsg); }else{ return $this->errmsg; } } function validate_string($value,$args,$typemsg = null){ if(is_string($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须是字符!'); } return false; } } function validate_time($value,$args,$typemsg = null){ $test = @strtotime($value); if ($test === false || $test === - 1) { if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'不是正确的时间/日期格式!'); } return false; } if(preg_match('/time_format(([^(]+))=?([^\s]*)/',$args['expression'],$t)){ if(date($t[1],$test) == $value){ return true; }else{ if(!empty($t[2])){ $this->_setMsg($args['field'],null,$t[2]); }else{ $this->_setMsg($args['field'],$args['cname'],'不是正确的时间/日期格式!'); } return false; } } return true; } function validate_alnum($value,$args,$typemsg = null) { if(ctype_alnum($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'只能是数字和字母!'); } return false; } } function validate_alpha($value,$args,$typemsg = null) { if(ctype_alpha($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须是纯英文字!'); } return false; } } function validate_alnumu($value,$args,$typemsg = null) { if(preg_match('/[^a-zA-Z0-9_]/', $value) == 0){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'只能是字母数字和下划线!'); } return false; } } function validate_digits($value,$args,$typemsg = null) { if(is_numeric($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须是数字!'); } return false; } } function validate_graph($value,$args,$typemsg = null) { if(ctype_graph($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须是可见字符!'); } return false; } } function validate_lower($value,$args,$typemsg = null) { if(ctype_lower($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须全部小写!'); } return false; } } function validate_print($value,$args,$typemsg = null) { if(ctype_print($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须是可打印字符!'); } return false; } } function validate_punct($value,$args,$typemsg = null) { if(ctype_punct($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须是标点符号!'); } return false; } } function validate_whitespace($value,$args,$typemsg = null) { if(ctype_space($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须为空格或制表符!'); } return false; } } function validate_upper($value,$args,$typemsg = null) { if(ctype_upper($value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须全部大写!'); } return false; } } function validate_int($value,$args,$typemsg = null) { if (is_null($this->_locale)) { $this->_locale = localeconv(); } $value = str_replace($this->_locale['decimal_point'], '.', $value); $value = str_replace($this->_locale['thousands_sep'], '', $value); if (strval(intval($value)) != $value) { if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须为整数!'); } return false; } return true; } function validate_float($value,$args,$typemsg = null) { if (is_null($this->_locale)) { $this->_locale = localeconv(); } $value = str_replace($this->_locale['decimal_point'], '.', $value); $value = str_replace($this->_locale['thousands_sep'], '', $value); if (strval(floatval($value)) != $value) { if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须为浮点数!'); } return false; } return true; } /** * 是否是 IPv4 地址(格式为 a.b.c.h) * * @param mixed $value * * @return boolean */ function validate_ipv4($value,$args,$typemsg = null) { $test = @ip2long($value); if($test !== - 1 && $test !== false){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'不是有效的IP地址!'); } return false; } } /** * 是否是二进制数值 * * @param mixed $value * * @return boolean */ function validate_binary($value,$args,$typemsg = null) { if(preg_match('/[01]+/', $value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'必须是二进制数字!'); } return false; } } /** * 是否是 Internet 域名 * * @param mixed $value * * @return boolean */ function validate_domain($value,$args,$typemsg = null) { if(preg_match('/[a-z0-9.]+/i', $value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'不是有效的域名!'); } return false; } } function validate_email($value,$args,$typemsg = null) { if(preg_match('/^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$/i', $value)){ return true; }else{ if(isset($typemsg)){ $this->_setMsg($args['field'],null,$typemsg); }else{ $this->_setMsg($args['field'],$args['cname'],'不是有效的email!'); } return false; } } function _setMsg($key,$name=null,$text){ if(!isset($this->errmsg[$key])){ if(!isset($name)){ $this->errmsg[$key] = str_replace(array('{SP}','{LF}','{VE}'),array(' ',"n",'|'),$text); }else{ $this->errmsg[$key] = $name.': '.$text; } } } }
文章网址:http://www.phprm.com/code/8cd0d67cc73efc83b2d2ab31bfe23d4d.html
随意转载^^但请附上教程地址。