`

表单验证 Validator v1.05

阅读更多

表单的验证一直是网页设计者头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。

Validator是基于JavaScript技术的伪静态类和对象的自定义属性,可以对网页中的表单项输入进行相应的验证,允许同一页面中同时验证多个表单,熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。因为是伪静态类,所以在调用时不需要实例化,直接以"类名+.语法+属性或方法名"来调用。此外,Validator还提供3种不同的错误提示模式,以满足不同的需要。

Validator目前可实现的验证类型有:
[JavaScript] 版
Validator目前可实现的验证类型有:
1.是否为空;
2.中文字符;
3.双字节字符
4.英文;
5.数字;
6.整数;
7.实数;
8.Email地址;
9.使用HTTP协议的网址;
10.电话号码;
11.货币;
12.手机号码;
13.邮政编码;
14.身份证号码(1.05增强);
15.QQ号码;
16.日期;
17.符合安全规则的密码;
18.某项的重复值;
19.两数的关系比较;
20.判断输入值是否在(n, m)区间;
21.输入字符长度限制(可按字节比较);
22.对于具有相同名称的单选按钮的选中判断;
23.限制具有相同名称的多选按钮的选中数目;
24.自定义的正则表达式验证;
25.文件上传格式过滤(1.04)
运行环境(客户端):
在Windows Server 2003下用IE6.0+SP1和Mozilla Firefox 1.0测试通过;
在Lunix RedHat 9下的Netscape测试通过;

 

示例:

<title>表单验证类 Validator v1.05</title>
 <style>
 body,td{font:normal 12px Verdana;color:#333333}
 input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
 table{border-collapse:collapse;}
 td{padding:3px}
 input{height:20;}
 textarea{width:80%;height:50px;overflow:auto;}
 form{display:inline}
 </style>
 <table align="center">
  <form name="theForm" id="demo" method="get" onSubmit="return Validator.Validate(this,2)">
  <tr>
   <td>身份证号:</td><td><input name="Card" dataType="IdCard" msg="身份证号错误"></td>
  </tr>
    <tr>
   <td>真实姓名:</td><td><input name="Name" dataType="Chinese" msg="真实姓名只允许中文"></td>
  </tr>
  <tr>
   <td>ID:</td><td><input name="username" dataType="Username" msg="ID名不符合规定"></td>
  </tr>
  <tr>
   <td>英文名:</td><td><input name="Nick" dataType="English" require="false" msg="英文名只允许英文字母"></td>
  </tr>
    <tr>
   <td>主页:</td><td><input name="Homepage" require="false" dataType="Url"   msg="非法的Url"></td>
  </tr>
  <tr>
   <td>密码:</td><td><input name="Password" dataType="SafeString"   msg="密码不符合安全规则" type="password"></td>
  </tr>
  <tr>
   <td>重复:</td><td><input name="Repeat" dataType="Repeat" to="Password" msg="两次输入的密码不一致" type="password"></td>
  </tr>
  <tr>
   <td>信箱:</td><td><input name="Email" dataType="Email" msg="信箱格式不正确"></td>
  </tr>
    <tr>
   <td>信箱:</td><td><input name="Email" dataType="Repeat" to="Email" msg="两次输入的信箱不一致"></td>
  </tr>
  <tr>
   <td>QQ:</td><td><input name="QQ" require="false" dataType="QQ" msg="QQ号码不存在"></td>
  </tr>
    <tr>
   <td>身份证:</td><td><input name="Card" dataType="IdCard" msg="身份证号码不正确"></td>
  </tr>
  <tr>
   <td>年龄:</td><td><input name="Year" dataType="Range" msg="年龄必须在18~28之间" min="18" max="28"></td>
  </tr>
   <tr>
   <td>年龄1:</td><td><input name="Year1" require="false" dataType="Compare" msg="年龄必须在18以上" to="18" operator="GreaterThanEqual"></td>
  </tr>
   <tr>
   <td>电话:</td><td><input name="Phone" require="false" dataType="Phone" msg="电话号码不正确"></td>
  </tr>
   <tr>
   <td>手机:</td><td><input name="Mobile" require="false" dataType="Mobile" msg="手机号码不正确"></td>
  </tr>
     <tr>
   <td>生日:</td><td><input name="Birthday" dataType="Date" format="ymd" msg="生日日期不存在"></td>
  </tr>
   <tr>
   <td>邮政编码:</td><td><input name="Zip" dataType="Custom" regexp="^[1-9]\d{5}$" msg="邮政编码不存在"></td>
  </tr>
  <tr>
   <td>邮政编码:</td><td><input name="Zip1" dataType="Zip" msg="邮政编码不存在"></td>
  </tr>
  <tr>
   <td>操作系统:</td><td><select name="Operation" dataType="Require"  msg="未选择所用操作系统" ><option value="">选择您所用的操作系统</option><option value="Win98">Win98</option><option value="Win2k">Win2k</option><option value="WinXP">WinXP</option></select></td>
  </tr>
  <tr>
   <td>所在省份:</td><td>广东<input name="Province" value="1" type="radio">陕西<input name="Province" value="2" type="radio">浙江<input name="Province" value="3" type="radio">江西<input name="Province" value="4" type="radio" dataType="Group"  msg="必须选定一个省份" ></td>
  </tr>
  <tr>
   <td>爱好:</td><td>运动<input name="Favorite" value="1" type="checkbox">上网<input name="Favorite" value="2" type="checkbox">听音乐<input name="Favorite" value="3" type="checkbox">看书<input name="Favorite" value="4" type="checkbox"" dataType="Group" min="2" max="3"  msg="必须选择2~3种爱好"></td>
  </tr>
   <td>自我介绍:</td><td><textarea name="Description" dataType="Limit" max="10"  msg="自我介绍内容必须在10个字之内">中文是一个字</textarea></td>
  </tr>
     <td>自传:</td><td><textarea name="History" dataType="LimitB" min="3" max="10"  msg="自传内容必须在[3,10]个字节之内">中文是两个字节t</textarea></td>
  </tr>
    <tr>
   <td>相片上传:</td><td><input name="up" dataType="Filter" msg="非法的文件格式" type="file" accept="jpg, gif, png"></td>
  </tr>
  <tr>
   <td colspan="2"><input name="Submit" type="submit" value="确定提交"><input onClick="Validator.Validate(document.getElementById('demo'))" value="检验模式1" type="button"><input onClick="Validator.Validate(document.getElementById('demo'),2)" value="检验模式2" type="button"><input onClick="Validator.Validate(document.getElementById('demo'),3)" value="检验模式3" type="button"></td>
  </tr>
  </form>
 </table>
<script>
 Validator = {
 Require : /.+/,
 Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
 Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
 Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/,
 Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
 IdCard : "this.IsIdCard(value)",
 Currency : /^\d+(\.\d+)?$/,
 Number : /^\d+$/,
 Zip : /^[1-9]\d{5}$/,
 QQ : /^[1-9]\d{4,8}$/,
 Integer : /^[-\+]?\d+$/,
 Double : /^[-\+]?\d+(\.\d+)?$/,
 English : /^[A-Za-z]+$/,
 Chinese :  /^[\u0391-\uFFE5]+$/,
 Username : /^[a-z]\w{3,}$/i,
 UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
 IsSafe : function(str){return !this.UnSafe.test(str);},
 SafeString : "this.IsSafe(value)",
 Filter : "this.DoFilter(value, getAttribute('accept'))",
 Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
 LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
 Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
 Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
 Range : "getAttribute('min') < (value|0) && (value|0) < getAttribute('max')",
 Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
 Custom : "this.Exec(value, getAttribute('regexp'))",
 Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
 ErrorItem : [document.forms[0]],
 ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
 Validate : function(theForm, mode){
  var obj = theForm || event.srcElement;
  var count = obj.elements.length;
  this.ErrorMessage.length = 1;
  this.ErrorItem.length = 1;
  this.ErrorItem[0] = obj;
  for(var i=0;i<count;i++){
   with(obj.elements[i]){
    var _dataType = getAttribute("dataType");
    if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined")  continue;
    this.ClearState(obj.elements[i]);
    if(getAttribute("require") == "false" && value == "") continue;
    switch(_dataType){
     case "IdCard" :
     case "Date" :
     case "Repeat" :
     case "Range" :
     case "Compare" :
     case "Custom" :
     case "Group" :
     case "Limit" :
     case "LimitB" :
     case "SafeString" :
     case "Filter" :
      if(!eval(this[_dataType])) {
       this.AddError(i, getAttribute("msg"));
      }
      break;
     default :
      if(!this[_dataType].test(value)){
       this.AddError(i, getAttribute("msg"));
      }
      break;
    }
   }
  }
  if(this.ErrorMessage.length > 1){
   mode = mode || 1;
   var errCount = this.ErrorItem.length;
   switch(mode){
   case 2 :
    for(var i=1;i<errCount;i++)
     this.ErrorItem[i].style.color = "red";
   case 1 :
    alert(this.ErrorMessage.join("\n"));
    this.ErrorItem[1].focus();
    break;
   case 3 :
    for(var i=1;i<errCount;i++){
    try{
     var span = document.createElement("SPAN");
     span.id = "__ErrorMessagePanel";
     span.style.color = "red";
     this.ErrorItem[i].parentNode.appendChild(span);
     span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
     }
     catch(e){alert(e.description);}
    }
    this.ErrorItem[1].focus();
    break;
   default :
    alert(this.ErrorMessage.join("\n"));
    break;
   }
   return false;
  }
  return true;
 },
 limit : function(len,min, max){
  min = min || 0;
  max = max || Number.MAX_VALUE;
  return min <= len && len <= max;
 },
 LenB : function(str){
  return str.replace(/[^\x00-\xff]/g,"**").length;
 },
 ClearState : function(elem){
  with(elem){
   if(style.color == "red")
    style.color = "";
   var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
   if(lastNode.id == "__ErrorMessagePanel")
    parentNode.removeChild(lastNode);
  }
 },
 AddError : function(index, str){
  this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
  this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
 },
 Exec : function(op, reg){
  return new RegExp(reg,"g").test(op);
 },
 compare : function(op1,operator,op2){
  switch (operator) {
   case "NotEqual":
    return (op1 != op2);
   case "GreaterThan":
    return (op1 > op2);
   case "GreaterThanEqual":
    return (op1 >= op2);
   case "LessThan":
    return (op1 < op2);
   case "LessThanEqual":
    return (op1 <= op2);
   default:
    return (op1 == op2);           
  }
 },
 MustChecked : function(name, min, max){
  var groups = document.getElementsByName(name);
  var hasChecked = 0;
  min = min || 1;
  max = max || groups.length;
  for(var i=groups.length-1;i>=0;i--)
   if(groups[i].checked) hasChecked++;
  return min <= hasChecked && hasChecked <= max;
 },
 DoFilter : function(input, filter){
return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);
 },
 IsIdCard : function(number){
  var date, Ai;
  var verify = "10x98765432";
  var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  var area = ['','','','','','','','','','','','北京','天津','河北','山西','内蒙古','','','','','','辽宁','吉林','黑龙江','','','','','','','','上海','江苏','浙江','安微','福建','江西','山东','','','','河南','湖北','湖南','广东','广西','海南','','','','重庆','四川','贵州','云南','西藏','','','','','','','陕西','甘肃','青海','宁夏','新疆','','','','','','台湾','','','','','','','','','','香港','澳门','','','','','','','','','国外'];
  var re = number.match(/^(\d{2})\d{4}(((\d{2})(\d{2})(\d{2})(\d{3}))|((\d{4})(\d{2})(\d{2})(\d{3}[x\d])))$/i);
  if(re == null) return false;
  if(re[1] >= area.length || area[re[1]] == "") return false;
  if(re[2].length == 12){
   Ai = number.substr(0, 17);
   date = [re[9], re[10], re[11]].join("-");
  }
  else{
   Ai = number.substr(0, 6) + "19" + number.substr(6);
   date = ["19" + re[4], re[5], re[6]].join("-");
  }
  if(!this.IsDate(date, "ymd")) return false;
  var sum = 0;
  for(var i = 0;i<=16;i++){
   sum += Ai.charAt(i) * Wi[i];
  }
  Ai +=  verify.charAt(sum%11);
  return (number.length ==15 || number.length == 18 && number == Ai);
 },
 IsDate : function(op, formatString){
  formatString = formatString || "ymd";
  var m, year, month, day;
  switch(formatString){
   case "ymd" :
    m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
    if(m == null ) return false;
    day = m[6];
    month = m[5]*1;
    year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
    break;
   case "dmy" :
    m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
    if(m == null ) return false;
    day = m[1];
    month = m[3]*1;
    year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
    break;
   default :
    break;
  }
  if(!parseInt(month)) return false;
  month = month==0 ?12:month;
  var date = new Date(year, month-1, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == (date.getMonth()+1) && day == date.getDate());
  function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
 }
 }
</script>

 

更新历史:

1.01
修正对12月份的日期验证(感谢flylg999)

1.03
修正Range验证类型时将数字当字符串比较的bug(感谢cncom和xtlhnhbb)
修正日期验证(感谢Papsam)
增加Username验证类型
增加对Phone验证类型时支持分机号

1.04
增加文件格式的过滤,用于上传时限制上传的文件格式

1.05
增强对身份证号码的验证

 

php版:

<title>表单验证类 Validator for PHP β</title>
 <style>
 body,td{font:normal 12px Verdana;color:#333333}
 input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
 table{border-collapse:collapse;}
 td{padding:3px}
 input{height:20;}
 textarea{width:80%;height:50px;overfmin:auto;}
 form{display:inline}
 </style>
 <table align="center">
<form action="Validator.php" method="post">
  <tr>
   <td>提示模式:</td><td>
   <select name="emode">
   <option value="1">警告提示框(客户端)</option>
   <option value="2">提示框加红色文字提示</option>
   <option value="3">附加红色提示</option>
   <option value="4">警告提示框(服务器端)</option>
   <option value="5">文字提示(服务器端)</option>
   </select></td>
  </tr>
  <tr>
   <td>真实姓名:</td><td><input name="Name"></td>
  </tr>
  <tr>
   <td>英文名:</td><td><input name="Nick"></td>
  </tr>
    <tr>
   <td>主页:</td><td><input name="Homepage"></td>
  </tr>
  <tr>
   <td>密码:</td><td><input name="Password"></td>
  </tr>
  <tr>
   <td>重复:</td><td><input name="Repeat"></td>
  </tr>
  <tr>
   <td>信箱:</td><td><input name="Email"></td>
  </tr>
    <tr>
   <td>信箱:</td><td><input name="Email1"></td>
  </tr>
  <tr>
   <td>QQ:</td><td><input name="QQ"></td>
  </tr>
    <tr>
   <td>身份证:</td><td><input name="Card"></td>
  </tr>
  <tr>
   <td>年龄:</td><td><input name="Year"></td>
  </tr>
   <tr>
   <td>年龄1:</td><td><input name="Year1"></td>
  </tr>
   <tr>
   <td>电话:</td><td><input name="Phone"></td>
  </tr>
   <tr>
   <td>手机:</td><td><input name="Mobile"></td>
  </tr>
     <tr>
   <td>生日:</td><td><input name="Birthday"></td>
  </tr>
   <tr>
   <td>邮政编码:</td><td><input name="Zip"></td>
  </tr>
  <tr>
   <td>邮政编码:</td><td><input name="Zip1"></td>
  </tr>
  <tr>
   <td>操作系统:</td><td><select name="OS"><option value="">选择您所用的操作系统</option><option value="Win98">Win98</option><option value="Win2k">Win2k</option><option value="WinXP">WinXP</option></select></td>
  </tr>
  <tr>
   <td>所在省份:</td><td>广东<input name="Province" value="1" type="radio">陕西<input name="Province" value="2" type="radio">浙江<input name="Province" value="3" type="radio">江西<input name="Province" value="4" type="radio"></td>
  </tr>
  <tr>
   <td>爱好:</td><td>运动<input name="Favorite" value="1" type="checkbox">上网<input name="Favorite" value="2" type="checkbox">听音乐<input name="Favorite" value="3" type="checkbox">看书<input name="Favorite" value="4" type="checkbox"></td>
  </tr>
   <td>自我介绍:</td><td><textarea name="Description">中文是一个字</textarea></td>
  </tr>
     <td>自传:</td><td><textarea name="History">中文是两个字节t</textarea></td>
  </tr>
  <tr>
   <td colspan="2"><input name="Submit" type="submit" value="确定提交"></td>
  </tr>
  </form>
 </table>
 <script defer>
 function dispError(items, messages, mode, separator){
 var iArray = items.split(separator);
 for(var i=iArray.length-1;i>=0;i--)
  iArray[i] = getObj(iArray[i]);
 messages = ("以下原因导致提交失败:\t\t\t\t" + separator + messages).split(separator);
 switch(mode){
  case 2 :
   for(i=iArray.length-1;i>=0;i--)
    iArray[i].style.color = "red";
  case 1 :
   alert(messages.join("\n"));
   iArray[0].focus();
   break;
  case 3 :
   for(i=iArray.length-1;i>=0;i--){
    try{
     var span = document.createElement("SPAN");
     span.id = "__ErrorMessagePanel";
     span.style.color = "red";
     iArray[i].parentNode.appendChild(span);
     span.innerHTML = messages[i+1].replace(/\d+:/,"*");
    }
    catch(e){alert(e.description);}
   }
   iArray[0].focus();
   break;
 }
 }

 function getObj(name){
 var objs = document.getElementsByName(name);
 return objs[objs.length -1];
 }
</script>
<?php
class Validator{
 var $submit;
 var $error_item, $error_message, $error_mode, $error_no;
 function Validator($submit_name = "Submit", $mode = 5){
  $this->submit = $submit_name;
  $this->error_mode = $mode;
  $this->error_no = 1;
 }

 function Validate($arr){
  if(! isset($_POST[$this->submit])) return false;
  $this->error_mode = $_POST["emode"];
  echo "<script defer>document.getElementsByName(\"emode\")[0].selectedIndex =" . ($this->error_mode - 1) . "</script>";
  if(is_array($arr)){
   $len = count($arr);
   for($i = 0; $i < $len; $i++){
    $this->is_valid($arr[$i]);
   }
  }

  if($this->error_no > 1) 
   $this->display_error();
 }

 function is_valid($str){
  $str = split(",", $str);
  if(count($str) < 3) return false;
  $name = trim($str[0]);
  $message = trim($str[1]);
  $data_type = trim($str[2]);
  $value = trim($_POST[$name]);

  switch($data_type){
   case "compare" :
    break;
   case "range" :
    break;
   case "repeat" :
    break;
   default :
    $method = "is_".$data_type;
    if(!$this->$method($value))
     $this->add_error($name, $message);
    break;
  }
 }

 function add_error($name, $message){
  $this->error_item .= "," . $name;
  $this->error_message .= "," . $this->error_no . ":" . $message;
  $this->error_no ++;
 }

 function display_error(){
  $this->error_item = ereg_replace("^,+", "", $this->error_item);
  $this->error_message = ereg_replace("^,+", "", $this->error_message);

  switch($this->error_mode){
   case 4 :
    $info = "以下原因导致提交失败:\t\t\t\t,";
    echo "<script>alert(\"".join("\\n", split(",", $info . $this->error_message))."\")</script>";
    //print >>>end;
    break;
   case 5 :
    echo "输入有错误:<br /><ul><li>" . ereg_replace( "\b\d+:", "",join("</li><li>", split(",", $this->error_message))) . "</li></ul>";
    echo "<br /><a href='javascript:history.back()'>返回</a>";
    exit;
    break;
   default :
    echo "<script defer>dispError(\"" . $this->error_item . "\", \"" . $this->error_message . "\", " . $this->error_mode . ", \",\")</script>";
   break;
  }
 }

 function is_email($str){
  return preg_match("/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/", $str);
 }

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

 function is_qq($str){
  return preg_match("/^[1-9]\d{4,8}$/", $str);
 }

 function is_zip($str){
  return preg_match("/^[1-9]\d{5}$/", $str);
 }

 function is_idcard($str){
  return preg_match("/^\d{15}(\d{2}[A-Za-z0-9])?$/", $str);
 }

 function is_chinese($str){
  return ereg("^[".chr(0xa1)."-".chr(0xff)."]+$",$str);
 }

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

 function is_mobile($str){
  return preg_match("/^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/", $str);
 }

 function is_phone($str){
  return preg_match("/^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/", $str);
 }

 function is_safe($str){
  return (preg_match("/^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/", $str) != 0);
 }
}
$v = new Validator();
$v->Validate(array("Name,名字只允许中文,chinese", "Nick, 只允许英文昵称, english", "Homepage, 主页Url格式不正确, url", "Password, 密码不符合安全规则, safe","Email,信箱格式错误,email", "QQ, QQ号码不存在, qq","Card, 身份证号码不正确, idcard","Phone, 电话号码不存在, phone","Mobile, 手机号码不存在, mobile","Zip, 邮政编码不存在, zip"));
?>

 

asp版:

 

<%
 Class Validator
 Private Re, Dic
 Private Separator
 Private ErrorItem, ErrorMessage, ErrorMode, ErrorNo
 Private FormName, FormIndex, FilePath, GetMethod

 Private Sub Class_Initialize()
  Set Re = New RegExp
  Re.IgnoreCase = True
  Re.Global = True
  Set Dic = CreateObject("Scripting.Dictionary")
  Separator = ","
  ErrorItem = ""
  ErrorMessage = ""
  ErrorMode = 5
  ErrorNo = 1
  FilePath = Server.MapPath(Request.ServerVariables("Script_Name"))
  GetMethod = "FSO"
 End Sub

 Private Sub Class_Terminate()
  Set Re = Nothing
  Dic.RemoveAll()
  Set Dic = Nothing
 End Sub

 Public Sub Validate()
  IF Request("Submit")="" Then Exit Sub
  IF Not IsValidPost() Then Exit Sub

  With Dic
   .Add "Compare", "Compare( PostValue, operator, toObj)"
   .Add "Custom", "Custom( PostValue,regexp )"
   .Add "Date", "IsDateFormat( PostValue,format )"
   .Add "Limit", "Limit( PostValue,min, max )"
   .Add "LimitB", "LimitB( PostValue,min, max )"
   .Add "Range", "Range( PostValue,min, max )"
   .Add "Repeat", "IsEqual( PostValue, Request(toObj) )"
   .Add "Group", "Group( PostValue,min, max )"

   .Add "NotEqual", "Op1 <> Op2"
   .Add "GreaterThan", "Op1 > Op2"
   .Add "GreaterThanEqual", "Op1 >= Op2"
   .Add "LessThan", "Op1 < Op2"
   .Add "LessThanEqual", "Op1 <= Op2"
   .Add "Equal", "Op1 = Op2"
  End With

  Call MatchCode()

  IF ErrorMessage <> "" Then DisplayError
 End Sub

 Private Sub MatchCode()
  Dim bI, bG, bM
  Dim Str

  Select Case GetMethod
   Case "FSO" :
    Dim FSO : Set FSO = Server.CreateObject("Scripting.FileSystemObject")
    Set TS = FSO.OpenTextFile(FilePath, 1, false)
    Str = TS.ReadAll()
    TS.Close
    Set TS = Nothing
    Set FSO = Nothing
   Case "XMLHTTP" :
    Dim XHttp : Set XHttp = Server.CreateObject("MSXML2.XMLHTTP")
    With XHttp
     Call .Open("Get", "http://"&Request.ServerVariables("Server_Name")&Request.ServerVariables("Script_Name"), False)
     Call .Send()
     Str =B2S(.responseBody)
    End With
    Set XHttp = Nothing
  End Select
  Dim itemString
  With Re
   bI = .IgnoreCase
   bG = .Global
   bM = .MultiLine
   .IgnoreCase = True
   .Global = True
   .Pattern = "[\s\S]*<form [^>]+>([\s\S]+)<\/form>[\s\S]*"
   Str = .Replace(Str, "$1")

   .Global = True
   .MultiLine = True
   .Pattern = "<\/?(?!input|textarea|select)[^>]*>"
   Str = .Replace(Str, "")

   .Pattern = "^.*(<(?=input|textarea|select)[^>]*>).*$"
   Str = .Replace(Str, "$1")

   .Pattern = "([\r\n]+|^\s*)(?=<)"
   Str = .Replace(Str, "")
   While Test("dataType=([""\'])([^""\'>]+)\1", Str)
    .MultiLine = False
    .Pattern = "^([^\n]+)\n([\s\S]*)$"
    itemString = .Replace(Str, "$1")
    Str = .Replace(Str, "$2")
    .Pattern = "(name|dataType|to1|min|max|msg|require|regexp|format)=([""\'])([^""\'>]+)\2"

    Dim Matches : Set Matches = .Execute(itemString)
    Dim Match, RetStr : RetStr = ""
       For Each Match in Matches
       RetStr = RetStr & Match.Value & " : "
       Next
    Call IsValid(Replace(Replace(Replace(RetStr, " : $", ""), "to=", "toObj="), """Require""", """NotEmpty"""))
   Wend
   .IgnoreCase = bI
   .Global = bG
   .MultiLine = bM

  End With
 End Sub

 Private Sub IsValid(ByVal Str)
  Dim name, msg, dataType, toObj, min, max, require, regexp, format
  min = 1 : max = 100 : require = "true" : format = "YMD"
  Execute Str
  Dim PostValue : PostValue = Request(name)
  Dim Fun
  
  IF require = "false" AND PostValue = "" Then Exit Sub

  IF Dic.Exists(dataType) Then 
   Fun = Dic.Item(dataType)
  Else Fun = "Is" & dataType &"( PostValue )"
  End IF

  IF Not Eval(Fun) Then Call AddError(name,msg)
 End Sub

 Private Sub DisplayError()
  ErrorItem = Replace(ErrorItem, "^(" & Separator & ")", "")
  ErrorMessage = Replace(ErrorMessage, "^(" & Separator & ")", "")
  Select Case ErrorMode
   Case 4
    ErrorMessage = Join(Split(ErrorMessage, Separator), "</li><li>")
    Response.Clear
    Response.Write "<div style=""padding-left:100px;font:bold 12px Tahoma"">输入有错误:<br><ul><li>" & Replace(ErrorMessage, "\b\d+:", "") & "</li></ul>"
    Response.Write "<br><a href='javascript:history.back()'>返回重填</a></div>"
    Response.End
   Case Else
    Response.Write("<script defer>dispError(""" & ErrorItem & """, """ & ErrorMessage & """, " & ErrorMode & ", """ & Separator & """)</script>")
  End Select
 End Sub

 Public Function IsEmail(ByVal Str)
  IsEmail = Test("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$", Str)
 End Function

 Public Function IsUrl(ByVal Str)
  IsUrl = Test("^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>""])*$", Str)
 End Function

 Public Function IsNum(ByVal Str)
  IsNum= Test("^\d+$", Str)
 End Function

 Public Function IsQQ(ByVal Str)
  IsQQ = Test("^[1-9]\d{4,8}$", Str)
 End Function

 Public Function IsZip(ByVal Str)
  IsZip = Test("^[1-9]\d{5}$", Str)
 End Function

 Public Function IsIdCard(ByVal Str)
  IsIdCard = Test("^\d{15}(\d{2}[A-Za-z0-9])?$", Str)
 End Function

 Public Function IsChinese(ByVal Str)
  IsChinese = Test("^[\u0391-\uFFE5]+$", Str)
 End Function

 Public Function IsEnglish(ByVal Str)
  IsEnglish = Test("^[A-Za-z]+$", Str)
 End Function

 Public Function IsMobile(ByVal Str)
  IsMobile = Test("^((\(\d{3}\))|(\d{3}\-))?13\d{9}$", Str)
 End Function

 Public Function IsPhone(ByVal Str)
  IsPhone = Test("^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$", Str)
 End Function

 Public Function IsSafe(ByVal Str)
  IsSafe = (Test("^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\""]*)|.{0,5})$|\s", Str) = False)
 End Function

 Public Function IsNotEmpty(ByVal Str)
  IsNotEmpty = LenB(Str) > 0
 End Function

 Public Function IsDateFormat(ByVal Str, ByVal Format)
  IF Not IsDate(Str) Then
   IsDateFormat = False
   Exit Function
  End IF

  IF Format = "YMD" Then
   IsDateFormat = Test("^((\d{4})|(\d{2}))([-./])(\d{1,2})\4(\d{1,2})$", Str)
  Else
   IsDateFormat = Test("^(\d{1,2})([-./])(\d{1,2})\\2((\d{4})|(\d{2}))$", Str)
  End IF
 End Function

 Public Function IsEqual(ByVal Src, ByVal Tar)
  IsEqual = (Src = Tar)
 End Function

 Public Function Compare(ByVal Op1, ByVal Operator, ByVal Op2)
  Compare = False
  IF Dic.Exists(Operator) Then
   Compare = Eval(Dic.Item(Operator))
   Elseif IsNotEmpty(Op1) Then
    Compare = Eval(Op1 &  Operator & Op2 )
  End IF
 End Function

 Public Function Range(ByVal Src, ByVal Min, ByVal Max)
  Min = CInt(Min) : Max = CInt(Max)
  Range = (Min < Src And Src < Max)
 End Function

 Public Function Group(ByVal Src, ByVal Min, ByVal Max)
  Min = CInt(Min) : Max = CInt(Max)
  Dim Num : Num = UBound(Split(Src, ",")) + 1
  Group = Range(Num, Min - 1, Max + 1)
 End Function

 Public Function Custom(ByVal Str, ByVal Reg)
  Custom = Test(Reg, Str)
 End Function

 Public Function Limit(ByVal Str, ByVal Min, ByVal Max)
  Min = CInt(Min) : Max = CInt(Max)
  Dim L : L = Len(Str)
  Limit = (Min <= L And L <= Max)
 End Function

 Public Function LimitB(ByVal Str, ByVal Min, ByVal Max)
  Min = CInt(Min) : Max = CInt(Max)
  Dim L : L =bLen(Str)
  LimitB = (Min <= L And L <= Max)
 End Function

 Private Function Test(ByVal Pattern, ByVal Str)
  Re.Pattern = Pattern
  Test = Re.Test(Str)
 End Function

 Public Function bLen(ByVal Str)
  bLen = Len(Replace(Str, "[^\x00-\xFF]", ".."))
 End Function

 Private Function Replace(ByVal Str, ByVal Pattern, ByVal ReStr)
  Re.Pattern = Pattern
  Replace =  Re.Replace(Str, ReStr)
 End Function

 Private Function B2S(ByVal iStr)
  Dim reVal : reVal= ""
  Dim i, Code, nCode
  For i = 1 to LenB(iStr)
   Code = AscB(MidB(iStr, i, 1))
   IF Code < &h80 Then
    reVal = reVal & Chr(Code)
   Else
    nCode = AscB(MidB(iStr, i+1, 1))
    reVal = reVal & Chr(CLng(Code) * &h100 + CInt(nCode))
    i = i + 1
   End IF
  Next
  B2S = reVal
 End Function

 Private Sub AddError(ByVal Name, ByVal Message)
  ErrorItem = ErrorItem & Separator & Name
  ErrorMessage = ErrorMessage & Separator & ErrorNo & ":" & Message
  ErrorNo = ErrorNo + 1
 End Sub

 Public Function IsValidPost()
  Dim Url1 : Url1 = Cstr(Request.ServerVariables("HTTP_REFERER"))
  Dim Url2 : Url2 = Cstr(Request.ServerVariables("SERVER_NAME"))
  IsValidPost = (Mid(Url1, 8, Len(Url2)) = Url2)
 End Function

 Public Property Let Mode(ByVal Val)
  ErrorMode = CInt(Val)
 End Property

 Public Property Let Form(ByVal Val)
  IF IsNumeric(Val) Then
   FormIndex = Val
  Else
   FormName = Val
  End IF
 End Property

 Public Property Let Path(ByVal Val)
  IF Test("^[A-Za-z]:\\\w+$", Val) Then
   FilePath = Val
  Else
   FilePath = Server.MapPath(Val)
  End IF
 End Property

 Public Property Let Method(ByVal Val)
  GetMethod = Val
 End Property
End Class
%>
 <title>表单验证类 Validator v1.0</title>
 <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 <style>
 body,td{font:normal 12px Verdana;color:#333333}
 input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
 table{border-collapse:collapse;}
 td{padding:3px}
 input{height:20;}
 textarea{width:80%;height:50px;overfmin:auto;}
 form{display:inline}
 </style>
 <script>
 function dispError(items, messages, mode, separator){
 var iArray = items.split(separator);
 for(var i=iArray.length-1;i>=0;i--)
  iArray[i] = getObj(iArray[i]);
 messages = ("以下原因导致提交失败:\t\t\t\t" + separator + messages).split(separator);
 switch(mode){
  case 2 :
   for(i=iArray.length-1;i>=0;i--)
    iArray[i].style.color = "red";
  case 1 :
   alert(messages.join("\n"));
   iArray[0].focus();
   break;
  case 3 :
   for(i=iArray.length-1;i>=0;i--){
    try{
     var span = document.createElement("SPAN");
     span.id = "__ErrorMessagePanel";
     span.style.color = "red";
     iArray[i].parentNode.appendChild(span);
     span.innerHTML = messages[i+1].replace(/\d+:/,"*");
    }
    catch(e){alert(e.description);}
   }
   iArray[0].focus();
   break;
 }
 }

 function getObj(name){
 var objs = document.getElementsByName(name);
 return objs[objs.length -1];
 }
</script>
 <form name="theForm" id="demo" action="" method="post" onSubmit="return true">
 <table align="center">
    <tr>
   <td>真实姓名:</td><td><input name="Name" dataType="Chinese" msg="真实姓名只允许中文"></td>
  </tr>
  <tr>
   <td>英文名:</td><td><input name="Nick" dataType="English" require="false" msg="英文名只允许英文字母"></td>
  </tr>
    <tr>
   <td>主页:</td><td><input name="Homepage" require="false" dataType="Url"   msg="非法的Url"></td>
  </tr>
  <tr>
   <td>密码:</td><td><input name="Password" dataType="Safe"   msg="密码不符合安全规则" type="password"></td>
  </tr>
  <tr>
   <td>重复:</td><td><input name="Repeat" dataType="Repeat" to="Password" msg="两次输入的密码不一致" type="password"></td>
  </tr>
  <tr>
   <td>信箱:</td><td><input name="Email" dataType="Email" msg="信箱格式不正确"></td>
  </tr>
    <tr>
   <td>信箱:</td><td><input name="Email1" dataType="Repeat" to="Email" msg="两次输入的信箱不一致"></td>
  </tr>
  <tr>
   <td>QQ:</td><td><input name="QQ" require="false" dataType="QQ" msg="QQ号码不存在"></td>
  </tr>
    <tr>
   <td>身份证:</td><td><input name="Card" dataType="IdCard" msg="身份证号码不正确"></td>
  </tr>
  <tr>
   <td>年龄:</td><td><input name="Year" dataType="Range" msg="年龄必须在18~28之间" min="18" max="28"></td>
  </tr>
   <tr>
   <td>年龄1:</td><td><input name="Year1" require="false" dataType="Compare" msg="年龄必须在18以上" to1="18" operator="GreaterThanEqual"></td>
  </tr>
   <tr>
   <td>电话:</td><td><input name="Phone" require="false" dataType="Phone" msg="电话号码不正确"></td>
  </tr>
   <tr>
   <td>手机:</td><td><input name="Mobile" require="false" dataType="Mobile" msg="手机号码不正确"></td>
  </tr>
     <tr>
   <td>生日:</td><td><input name="Birthday" dataType="Date" format="YMD" msg="生日日期不存在"></td>
  </tr>
   <tr>
   <td>邮政编码:</td><td><input name="Zip" dataType="Custom" regexp="^[1-9]\d{5}$" msg="邮政编码不存在"></td>
  </tr>
  <tr>
   <td>邮政编码:</td><td><input name="Zip1" dataType="Zip" msg="邮政编码不存在"></td>
  </tr>
  <tr>
   <td>操作系统:</td><td><select name="OS" dataType="Require"  msg="未选择所用操作系统" ><option value="">选择您所用的操作系统</option><option value="Win98">Win98</option><option value="Win2k">Win2k</option><option value="WinXP">WinXP</option></select></td>
  </tr>
  <tr>
   <td>所在省份:</td><td>广东<input name="Province" value="1" type="radio">陕西<input name="Province" value="2" type="radio">浙江<input name="Province" value="3" type="radio">江西<input name="Province" value="4" type="radio" dataType="Group"  msg="必须选定一个省份"></td>
  </tr>
  <tr>
   <td>爱好:</td><td>运动<input name="Favorite" value="1" type="checkbox">上网<input name="Favorite" value="2" type="checkbox">听音乐<input name="Favorite" value="3" type="checkbox">看书<input name="Favorite" value="4" type="checkbox" dataType="Group" min="2" max="3"  msg="必须选择2~3种爱好"></td>
  </tr>
  <tr>
   <td>自我介绍:</td><td><textarea name="Description" dataType="Limit" max="10"  msg="自我介绍内容必须在10个字之内">中文是一个字</textarea></td>
  </tr>
  <tr>
     <td>自传:</td><td><textarea name="History" dataType="LimitB" min="3" max="10"  msg="自传内容必须在[3~10]个字节之内">中文是两个字节t</textarea></td>
  </tr>
  <tr>
   <td colspan="2"><input name="Submit" type="submit" value="确定提交"></td>
  </tr>
 </table>
</form>
<%
 Dim V : Set V = New Validator
 V.Mode = 3
 V.Method = "XMLHTTP"
 V.Validate()
 Set V = Nothing
%>
</body>
</html>

 

分享到:
评论

相关推荐

    Javascript表单验证控件Validator v1.05

    JavaScript表单验证控件Validator v1.05是一款用于网页前端数据验证的工具,它能够帮助开发者在用户提交表单前检查输入的数据是否符合预设的规则,从而提高用户体验并减少服务器端的压力。该控件通常包含一系列的...

    Javascript表单验证控件(Validator v1.05).rar

    Javascript表单验证控件(Validator v1.05).rar --------------------------------- 内含以下两个文件: Validator.chm(详细的使用帮助文档) validator.js(源代码,当然没有prototype.js强大,但最...

    Javascript表单验证控件(Validator v1.05)

    JavaScript是一种广泛应用于...总的来说,Validator v1.05是一个实用的JavaScript库,为Web开发人员提供了方便的工具来管理表单验证。通过理解和运用这个库,可以创建更健壮、用户友好的Web表单,提升用户的交互体验。

    C#实现身份证号码验证的方法+Validator v1.05表单验证类.txt

    C#实现身份证号码验证的方法+Validator v1.05表单验证类

    我佛山人 Validator v1.05 selectersky2009.08.09修改版

    很好用的表单通用验证。不过有时一个文本框里有默认文本是,验证就会达不到效果。 于是增加属性:allowDefaultValue:是否允许默认值通过验证 默认为是 值为flase时,不允许 另外因为个人需要修改了验证用户名和邮箱...

    表单验证 Validator v4.0

    表单验证 Validator v4.0 表单的验证一直是Web开发头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于UI设计与业务逻辑上。 Validator早期...

    表单验证 Validator v4.0 案例 源码 帮助文档

    表单验证 Validator v4.0 表单的验证一直是Web开发头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于UI设计与业务逻辑上。 Validator早期版本...

    表单验证Validator V4.0(html文件)

    使用`Validator V4.0`,开发者可以通过以下步骤实现表单验证: 1. **引入库**:在HTML文件中,通过`&lt;script&gt;`标签引入Validator的JavaScript文件。 2. **标记表单元素**:在`&lt;input&gt;`标签中添加相应的验证属性,如`...

    表单验证Validator v4.0代码生成工具(太利害啦)

    表单验证Validator v4.0代码生成工具实在太好用啦,做表单验证的时候只要打开这个工具,勾上需要验证的属性一点生成按钮就可以把表单验证Validator v4.0代码生成,这样的话就可以僻免写错代码啦....

    表单验证Validator v1.0(CHM) 下载

    表单的验证一直是网页设计者头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。 Validator是基于JavaScript...

    一个非常强大完整的web表单验证程序Validator v1.05

    表单的验证一直是网页设计者头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。 Validator是基于JavaScript技术的...

    表单验证控件commons-validator-1.3.1

    表单验证控件commons-validator-1.3.1表单验证控件commons-validator-1.3.1表单验证控件commons-validator-1.3.1表单验证控件commons-validator-1.3.1表单验证控件commons-validator-1.3.1表单验证控件commons-...

    Validator V4.0 (表单验证,内含程序及详细的说明文档)

    Validator V4.0 是一款强大的表单验证框架,专为前端开发者设计,旨在提升用户体验并确保数据输入的准确性和安全性。这款工具集成了Ajax验证功能,使得用户在无需刷新页面的情况下即可完成验证,大大提高了交互性。...

    Mootools 表单验证插件 validator v4.0.zip

    在这个"Mootools 表单验证插件 validator v4.0.zip"压缩包中,我们主要关注的是这个版本的Validator插件及其在前端开发中的应用。 首先,让我们深入了解一下Validator插件的核心功能。它允许开发者定义一系列验证...

    js表单验证Validator.js

    **JavaScript表单验证库——Validator.js** `Validator.js` 是一个专为JavaScript设计的轻量级表单验证库,主要用于增强HTML表单的验证功能,确保用户输入的数据符合预设的规则。它允许开发者在客户端进行实时数据...

    bootstrap表单验证插件bootstrapvalidator

    BootstrapValidator是一款基于Bootstrap框架的强大的表单验证插件,它为开发者提供了便捷的方式来验证用户在网页表单中输入的数据。这个插件通过简单的配置选项,可以让开发者轻松地为各种表单字段添加验证规则,...

    表单验证类 validator.js

    推荐一个很好的“Validator表单验证类”,CHM帮助下载地址:http://mooui.com/validator/v4/validator4.0.rar

    Vue表单验证插件Vue Validator使用方法详解

    Vue Validator是Vue.js框架的一个强大插件,专门用于处理表单验证。它的主要目标是简化在Vue应用中创建和管理复杂表单验证的过程。在本文中,我们将深入探讨Vue Validator的使用方法及其核心特性。 首先,为了使用...

    bootstrapvalidator 表单验证

    总的来说,BootstrapValidator是前端开发中进行表单验证的理想工具,它易于使用、功能强大,且与Bootstrap的样式无缝集成,能够帮助你构建出具有高质量用户体验的Web应用。在实际项目中,开发者可以根据需求调整验证...

Global site tag (gtag.js) - Google Analytics