PHP智能表单验证(可扩展) ---- 标题不够长???????
时间:2009-07-15
来源:互联网
曾经在做Webif的二次开发的时候,里面使用了awk做了一个表单验证。后来突发奇想用php简单实现了一个。
演示地址: http://blog.meiu.cn/demos/validate/
帖子末尾有此演示下载。
下面简单说明一下使用方法:
- 验证字串含义:第一项为post过来数据的name,第二项为别名,第三项是数据的类型,第四项为是否必填,第五项是其他表达式(如字符长度限制,数字大小,等等)。
- 后三项可以自定义提示信息,使用"=您要提示的信息"来使用
- $validator->validate(要验证的数组,验证字串,true:检测到一个错误就跳出)
- 自定义函数:validate_myfun(需要验证的值,规则数组)
- 自定义表达式:_erun_myfun(要验证的值,规则数组,表达式数组)
使用范例:
[code]
<?php
/**
*
* Created By Baoling
* Date: 2009-07-13
* Contact: [email protected] / QQ:110042869
* Blog: blog.meiu.cn
*/
$validator = new Validator();
$validator_string = "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)";
$result = $validator->validate($_POST,$validator_string);
if($result){
print_r($validator->getMsg());
}else{
echo "success";
}
?>[/code]可能实现上稍微显得有些弱智,但是主要是提供给大家一种方便处理表单的方式,希望水平高的网友帮我修改此类!
下载此php类及演示代码:

作者: wksvo 发布时间: 2009-07-15
作者: nianjin 发布时间: 2009-07-17
作者: hubo888168 发布时间: 2009-07-17
Jquery的验证时基于客户端的,就是只是js验证。换句话说,客户端提交的信息都是不可靠的,所以客户端验证好了服务端不能不再次认证。
我上面的脚本是服务端的。
作者: wksvo 发布时间: 2009-07-20

作者: ninetail 发布时间: 2009-07-22
<?php
header("Content-Type: text/html; charset=Utf-8");
/**-----------------------------------------------------------------------------
* 表单验证过滤检测类
* 技术支持:http://www.biz-m.com
* 说明:
* 缺省忽略 N
* 必填检测, Y
* 转义输出 _escape
* 过滤输出 _filter
* 关键字过滤 _key
* 注销无输出 _cancel (为数字时被注销)
* 注销无输出 _delete (无条件注销)
* md5加密输出 _md5
* base64加密输出 _base64
* 检测类-------------------
* 数字类 num
* 全中文 cn
* 英文字母 en
* 金额 money
* 网址 url
* 邮箱 email
* 电话 tel
* 字节限制 0-99999999
* 数字字母 numen
* 铭感词检测 key (铭感词过滤之词库 $badkey ="王八蛋|去死";
* 多选,下来菜单和单选使用Y_ 设定初始值
*---------------------------------------------------------------------*/
/**
* 表单生成验证文件
*/
$_form = new formHtmlFind();
class formHtmlFind{
/**
* 输出表单函数
* $formKey 表单键
* $infoArray 更新时的原始信息数组
*/
public function formHtml($array,$infoArray='')
{
// 检测数组是否存在
if(empty($array))return false;
$newform = null;
// 信息数组(更新信息)
$this->infoArray = !empty($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(empty($arr))return false;
// input Type
$type = $key;
// input NAME
$name = trim($arr[0]);
// input 初始值 不包含多选,单选类
$value = (!empty($this->infoArray[$name]))? trim($this->infoArray[$name]):trim($arr[1]);
$value = empty($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>\r\n";
}
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(empty($array)||empty($_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 (!empty($arr)&&'file' != $key)$newData[trim($arr[0])] = $this->postFind($arr,$key);
}
// 输出表单
if(!empty($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(empty($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(!empty($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 = (!empty($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 = (!empty($this->post[$name]))?$this->post[$name]:$this->infoarray[$name];
// 兼容多选的识别,转为数组
if(!empty($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(empty($title))$titarray = array_values($value);
}
else $valarray = explode("|",$value);
// 取消表单的初始默认值
if(!empty($this->post)&&!empty($this->infoArray))$value = preg_replace("/Y_/i",'',$value);
foreach ($valarray as $key =>$varl)
{
// 非默认的识别
if(!empty($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>\r\n"
,$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>\r\n",
$_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>\r\n",$_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>\r\n",$titarray[0],$outform,$name);
}
/**
* 表单验证 及全部 ck_类函数
*/
private function ck_split($standard,$name,$title,$find,$error)
{
// 非必填缺省跳过
if(eregi('N',$find) && empty($this->post[$name]))return false;
// 必填缺省检测
if(eregi('Y',$find) && empty($this->post[$name]))return "[\"J{$name}\",\"$error\"],";
$t_error = null;
// 多项检测
$arr = explode(',',$standard);
// POST数据检测
if(!empty($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(empty($this->error))return false;
return "
<script language=javascript> \r\n var error = new Array(".trim($this->error,',').");
\r\n for (i=0; i < error.length; i++){
\r\n document.getElementById(error[0]).innerHTML=error[1];
}\r\n </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(!empty($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>';
?>回复:very good !
作者: cyhchenz 发布时间: 2009-07-22
作者: libailin 发布时间: 2009-09-08
作者: kuake 发布时间: 2009-09-17
后学习~~
作者: mailangel123 发布时间: 2009-09-22
作者: zhoushj 发布时间: 2009-11-21
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28