表单的验证一直是网页设计者头痛的问题,表单验证类 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测试通过;对于客户端的表单验证,这个基于JavaScript编写的Validator基本上都可以满足,具体可以下载CHM文件:
示例:
代码如下: <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 v1.05 code by 我佛山人 wfsr@msn.com *************************************************/ 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> [Ctrl+A 全选 提示:你可先修改部分代码,再点运行代码]更新历史:
1.01
修正对12月份的日期验证(感谢flylg999)1.03
修正Range验证类型时将数字当字符串比较的bug(感谢cncom和xtlhnhbb)修正日期验证(感谢Papsam)增加Username验证类型增加对Phone验证类型时支持分机号1.04
增加文件格式的过滤,用于上传时限制上传的文件格式1.05
增强对身份证号码的验证[ASP]版代码拷贝框 1 < % 2 Class Validator 3 ' ************************************************* 4 ' Validator for ASP beta 2 服务器端脚本 5 ' code by 我佛山人 6 ' wfsr@cunite.com 7 ' http://www.cunite.com 8 ' ************************************************* 9 Private Re, Dic 10 Private Separator 11 Private ErrorItem, ErrorMessage, ErrorMode, ErrorNo 12 Private FormName, FormIndex, FilePath, GetMethod 13 14 Private Sub Class_Initialize() 15 Set Re = New RegExp 16 Re.IgnoreCase = True 17 Re.Global = True 18 Set Dic = CreateObject ( " Scripting.Dictionary " ) 19 Separator = " ," 20 ErrorItem = " " 21 ErrorMessage = " " 22 ErrorMode = 5 23 ErrorNo = 1 24 FilePath = Server.MapPath(Request.ServerVariables( " Script_Name " )) 25 GetMethod = " FSO" 26 End Sub 27 28 Private Sub Class_Terminate() 29 Set Re = Nothing 30 Dic.RemoveAll() 31 Set Dic = Nothing 32 End Sub 33 34 Public Sub Validate() 35 IF Request( " Submit " ) = "" Then Exit Sub 36 IF Not IsValidPost() Then Exit Sub 37 38 With Dic 39 .Add " Compare " , " Compare( PostValue, operator, toObj)" 40 .Add " Custom " , " Custom( PostValue,regexp )" 41 .Add " Date " , " IsDateFormat( PostValue,format )" 42 .Add " Limit " , " Limit( PostValue,min, max )" 43 .Add " LimitB " , " LimitB( PostValue,min, max )" 44 .Add " Range " , " Range( PostValue,min, max )" 45 .Add " Repeat " , " IsEqual( PostValue, Request(toObj) )" 46 .Add " Group " , " Group( PostValue,min, max )" 47 48 .Add " NotEqual " , " Op1 <> Op2" 49 .Add " GreaterThan " , " Op1 > Op2" 50 .Add " GreaterThanEqual " , " Op1 >= Op2" 51 .Add " LessThan " , " Op1 < Op2" 52 .Add " LessThanEqual " , " Op1 <= Op2" 53 .Add " Equal " , " Op1 = Op2" 54 End With 55 56 Call MatchCode() 57 58 IF ErrorMessage <> "" Then DisplayError 59 End Sub 60 61 Private Sub MatchCode() 62 Dim bI, bG, bM 63 Dim Str 64 65 Select Case GetMethod 66 Case " FSO " : 67 Dim FSO : Set FSO = Server. CreateObject ( " Scripting.FileSystemObject " ) 68 Set TS = FSO.OpenTextFile(FilePath, 1 , false ) 69 Str = TS.ReadAll() 70 TS.Close 71 Set TS = Nothing 72 Set FSO = Nothing 73 Case " XMLHTTP " : 74 Dim XHttp : Set XHttp = Server. CreateObject ( " MSXML2.XMLHTTP " ) 75 With XHttp 76 Call .Open( " Get " , " http:// " & Request.ServerVariables( " Server_Name " ) & Request.ServerVariables( " Script_Name " ), False ) 77 Call .Send() 78 Str = B2S(.responseBody) 79 End With 80 Set XHttp = Nothing 81 End Select 82 Dim itemString 83 With Re 84 bI = .IgnoreCase 85 bG = .Global 86 bM = .MultiLine 87 .IgnoreCase = True 88 .Global = True 89 .Pattern = " [\s\S]*<form [^>]+>([\s\S]+)<\/form>[\s\S]*" 90 Str = . Replace (Str, " $1 " ) 91 92 .Global = True 93 .MultiLine = True 94 .Pattern = " <\/?(?!input|textarea|select)[^>]*>" 95 Str = . Replace (Str, "" ) 96 97 .Pattern = " ^.*(<(?=input|textarea|select)[^>]*>).*$" 98 Str = . Replace (Str, " $1 " ) 99 100 .Pattern = " ([\r\n]+|^\s*)(?=<)" 101 Str = . Replace (Str, "" ) 102 While Test( " dataType=([""\'])([^""\'>]+)\1 " , Str) 103 .MultiLine = False 104 .Pattern = " ^([^\n]+)\n([\s\S]*)$" 105 itemString = . Replace (Str, " $1 " ) 106 Str = . Replace (Str, " $2 " ) 107 .Pattern = " (name|dataType|to1|min|max|msg|require|regexp|format)=([""\'])([^""\'>]+)\2" 108 109 Dim Matches : Set Matches = . Execute (itemString) 110 Dim Match, RetStr : RetStr = " " 111 For Each Match in Matches 112 RetStr = RetStr & Match.Value & " : " 113 Next 114 Call IsValid( Replace ( Replace ( Replace (RetStr, " : $ " , "" ), " to= " , " toObj= " ), " ""Require"" " , " ""NotEmpty"" " )) 115 Wend 116 .IgnoreCase = bI 117 .Global = bG 118 .MultiLine = bM 119 120 End With 121 End Sub 122 123 Private Sub IsValid(ByVal Str) 124 Dim name, msg, dataType, toObj, min, max, require, regexp, format 125 min = 1 : max = 100 : require = " true " : format = " YMD" 126 Execute Str 127 Dim PostValue : PostValue = Request(name) 128 Dim Fun 129 130 IF require = " false " AND PostValue = "" Then Exit Sub 131 132 IF Dic.Exists(dataType) Then 133 Fun = Dic.Item(dataType) 134 Else Fun = " Is " & dataType & " ( PostValue )" 135 End IF 136 137 IF Not Eval (Fun) Then Call AddError(name,msg) 138 End Sub 139 140 Private Sub DisplayError() 141 ErrorItem = Replace (ErrorItem, " ^( " & Separator & " ) " , "" ) 142 ErrorMessage = Replace (ErrorMessage, " ^( " & Separator & " ) " , "" ) 143 Select Case ErrorMode 144 Case 4 145 ErrorMessage = Join ( Split (ErrorMessage, Separator), " </li><li> " ) 146 Response.Clear 147 Response.Write " <div style=""padding-left:100px;font:bold 12px Tahoma"">输入有错误:<br><ul><li> " & Replace (ErrorMessage, " \b\d+: " , "" ) & " </li></ul>" 148 Response.Write " <br><a href='javascript:history.back()'>返回重填</a></div>" 149 Response. End 150 Case Else 151 Response.Write( " <script defer>dispError("" " & ErrorItem & " "", "" " & ErrorMessage & " "", " & ErrorMode & " , "" " & Separator & " "")</script> " ) 152 End Select 153 End Sub 154 155 Public Function IsEmail(ByVal Str) 156 IsEmail = Test( " ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ " , Str) 157 End Function 158 159 Public Function IsUrl(ByVal Str) 160 IsUrl = Test( " ^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>""])*$ " , Str) 161 End Function 162 163 Public Function IsNum(ByVal Str) 164 IsNum = Test( " ^\d+$ " , Str) 165 End Function 166 167 Public Function IsQQ(ByVal Str) 168 IsQQ = Test( " ^[1-9]\d{4,8}$ " , Str) 169 End Function 170 171 Public Function IsZip(ByVal Str) 172 IsZip = Test( " ^[1-9]\d{5}$ " , Str) 173 End Function 174 175 Public Function IsIdCard(ByVal Str) 176 IsIdCard = Test( " ^\d{15}(\d{2}[A-Za-z0-9])?$ " , Str) 177 End Function 178 179 Public Function IsChinese(ByVal Str) 180 IsChinese = Test( " ^[\u0391-\uFFE5]+$ " , Str) 181 End Function 182 183 Public Function IsEnglish(ByVal Str) 184 IsEnglish = Test( " ^[A-Za-z]+$ " , Str) 185 End Function 186 187 Public Function IsMobile(ByVal Str) 188 IsMobile = Test( " ^((\(\d{3}\))|(\d{3}\-))?13\d{9}$ " , Str) 189 End Function 190 191 Public Function IsPhone(ByVal Str) 192 IsPhone = Test( " ^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$ " , Str) 193 End Function 194 195 Public Function IsSafe(ByVal Str) 196 IsSafe = (Test( " ^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\""]*)|.{0,5})$|\s " , Str) = False ) 197 End Function 198 199 Public Function IsNotEmpty(ByVal Str) 200 IsNotEmpty = LenB(Str) > 0 201 End Function 202 203 Public Function IsDateFormat(ByVal Str, ByVal Format) 204 IF Not IsDate (Str) Then 205 IsDateFormat = False 206 Exit Function 207 End IF 208 209 IF Format = " YMD " Then 210 IsDateFormat = Test( " ^((\d{4})|(\d{2}))([-./])(\d{1,2})\4(\d{1,2})$ " , Str) 211 Else 212 IsDateFormat = Test( " ^(\d{1,2})([-./])(\d{1,2})\\2((\d{4})|(\d{2}))$ " , Str) 213 End IF 214 End Function 215 216 Public Function IsEqual(ByVal Src, ByVal Tar) 217 IsEqual = (Src = Tar) 218 End Function 219 220 Public Function Compare(ByVal Op1, ByVal Operator, ByVal Op2) 221 Compare = False 222 IF Dic.Exists(Operator) Then 223 Compare = Eval (Dic.Item(Operator)) 224 Elseif IsNotEmpty(Op1) Then 225 Compare = Eval (Op1 & Operator & Op2 ) 226 End IF 227 End Function 228 229 Public Function Range(ByVal Src, ByVal Min, ByVal Max) 230 Min = CInt (Min) : Max = CInt (Max) 231 Range = (Min < Src And Src < Max) 232 End Function 233 234 Public Function Group(ByVal Src, ByVal Min, ByVal Max) 235 Min = CInt (Min) : Max = CInt (Max) 236 Dim Num : Num = UBound ( Split (Src, " , " )) + 1 237 Group = Range(Num, Min - 1 , Max + 1 ) 238 End Function 239 240 Public Function Custom(ByVal Str, ByVal Reg) 241 Custom = Test(Reg, Str) 242 End Function 243 244 Public Function Limit(ByVal Str, ByVal Min, ByVal Max) 245 Min = CInt (Min) : Max = CInt (Max) 246 Dim L : L = Len (Str) 247 Limit = (Min <= L And L <= Max) 248 End Function 249 250 Public Function LimitB(ByVal Str, ByVal Min, ByVal Max) 251 Min = CInt (Min) : Max = CInt (Max) 252 Dim L : L = bLen(Str) 253 LimitB = (Min <= L And L <= Max) 254 End Function 255 256 Private Function Test(ByVal Pattern, ByVal Str) 257 Re.Pattern = Pattern 258 Test = Re.Test(Str) 259 End Function 260 261 Public Function bLen(ByVal Str) 262 bLen = Len ( Replace (Str, " [^\x00-\xFF] " , " .. " )) 263 End Function 264 265 Private Function Replace (ByVal Str, ByVal Pattern, ByVal ReStr) 266 Re.Pattern = Pattern 267 Replace = Re. Replace (Str, ReStr) 268 End Function 269 270 Private Function B2S(ByVal iStr) 271 Dim reVal : reVal = " " 272 Dim i, Code, nCode 273 For i = 1 to LenB(iStr) 274 Code = AscB(MidB(iStr, i, 1 )) 275 IF Code < & h80 Then 276 reVal = reVal & Chr (Code) 277 Else 278 nCode = AscB(MidB(iStr, i + 1 , 1 )) 279 reVal = reVal & Chr ( CLng (Code) * & h100 + CInt (nCode)) 280 i = i + 1 281 End IF 282 Next 283 B2S = reVal 284 End Function 285 286 Private Sub AddError(ByVal Name, ByVal Message) 287 ErrorItem = ErrorItem & Separator & Name 288 ErrorMessage = ErrorMessage & Separator & ErrorNo & " : " & Message 289 ErrorNo = ErrorNo + 1 290 End Sub 291 292 Public Function IsValidPost() 293 Dim Url1 : Url1 = Cstr (Request.ServerVariables( " HTTP_REFERER " )) 294 Dim Url2 : Url2 = Cstr (Request.ServerVariables( " SERVER_NAME " )) 295 IsValidPost = ( Mid (Url1, 8 , Len (Url2)) = Url2) 296 End Function 297 298 Public Property Let Mode(ByVal Val) 299 ErrorMode = CInt (Val) 300 End Property 301 302 Public Property Let Form(ByVal Val) 303 IF IsNumeric (Val) Then 304 FormIndex = Val 305 Else 306 FormName = Val 307 End IF 308 End Property 309 310 Public Property Let Path(ByVal Val) 311 IF Test( " ^[A-Za-z]:\\\w+$ " , Val) Then 312 FilePath = Val 313 Else 314 FilePath = Server.MapPath(Val) 315 End IF 316 End Property 317 318 Public Property Let Method(ByVal Val) 319 GetMethod = Val 320 End Property 321 End Class 322 % > 323 < title > 表单验证类 Validator v1. 0 </ title > 324 < meta http - equiv = " Content-Type " content = " text/html; charset=gb2312 " > 325 < style > 326 body,td{font:normal 12px Verdana;color:# 333333 } 327 input,textarea, select ,td{font:normal 12px Verdana;color:# 333333 ;border:1px solid # 999999 ;background:#ffffff} 328 table{border - collapse:collapse;} 329 td{padding:3px} 330 input{height: 20 ;} 331 textarea{width: 80 %;height:50px;overfmin:auto;} 332 form{display:inline} 333 </ style > 334 < script > 335 /************************************************* 336 Validator for ASP beta 2 客户端脚本 337 code by 我佛山人 338 wfsr@cunite.com 339 http: // www.cunite.com 340 *************************************************/ 341 function dispError(items, messages, mode, separator){ 342 var iArray = items. split (separator); 343 for (var i = iArray.length - 1 ;i >= 0 ;i -- ) 344 iArray[i] = getObj(iArray[i]); 345 messages = ( " 以下原因导致提交失败:\t\t\t\t " + separator + messages). split (separator); 346 switch(mode){ 347 case 2 : 348 for (i = iArray.length - 1 ;i >= 0 ;i -- ) 349 iArray[i].style.color = " red " ; 350 case 1 : 351 alert(messages. join ( " \n " )); 352 iArray[ 0 ].focus(); 353 break; 354 case 3 : 355 for (i = iArray.length - 1 ;i >= 0 ;i -- ){ 356 try{ 357 var span = document.createElement( " SPAN " ); 358 span.id = " __ErrorMessagePanel " ; 359 span.style.color = " red " ; 360 iArray[i].parentNode.appendChild(span); 361 span.innerHTML = messages[i + 1 ]. replace ( /\ d + : / , " * " ); 362 } 363 catch(e){alert(e.description);} 364 } 365 iArray[ 0 ].focus(); 366 break; 367 } 368 } 369 370 function getObj(name){ 371 var objs = document.getElementsByName(name); 372 return objs[objs.length - 1 ]; 373 } 374 </ script > 375 < form name = " theForm " id = " demo " action = "" method = " post " onSubmit = " return true " > 376 < table align = " center " > 377 < tr > 378 < td > 真实姓名: </ td >< td >< input name = " Name " dataType = " Chinese " msg = " 真实姓名只允许中文 " ></ td > 379 </ tr > 380 < tr > 381 < td > 英文名: </ td >< td >< input name = " Nick " dataType = " English " require = " false " msg = " 英文名只允许英文字母 " ></ td > 382 </ tr > 383 < tr > 384 < td > 主页: </ td >< td >< input name = " Homepage " require = " false " dataType = " Url " msg = " 非法的Url " ></ td > 385 </ tr > 386 < tr > 387 < td > 密码: </ td >< td >< input name = " Password " dataType = " Safe " msg = " 密码不符合安全规则 " type = " password " ></ td > 388 </ tr > 389 < tr > 390 < td > 重复: </ td >< td >< input name = " Repeat " dataType = " Repeat " to = " Password " msg = " 两次输入的密码不一致 " type = " password " ></ td > 391 </ tr > 392 < tr > 393 < td > 信箱: </ td >< td >< input name = " Email " dataType = " Email " msg = " 信箱格式不正确 " ></ td > 394 </ tr > 395 < tr > 396 < td > 信箱: </ td >< td >< input name = " Email1 " dataType = " Repeat " to = " Email " msg = " 两次输入的信箱不一致 " ></ td > 397 </ tr > 398 < tr > 399 < td > QQ: </ td >< td >< input name = " QQ " require = " false " dataType = " QQ " msg = " QQ号码不存在 " ></ td > 400 </ tr > 401 < tr > 402 < td > 身份证: </ td >< td >< input name = " Card " dataType = " IdCard " msg = " 身份证号码不正确 " ></ td > 403 </ tr > 404 < tr > 405 < td > 年龄: </ td >< td >< input name = " Year " dataType = " Range " msg = " 年龄必须在18~28之间 " min = " 18 " max = " 28 " ></ td > 406 </ tr > 407 < tr > 408 < td > 年龄1: </ td >< td >< input name = " Year1 " require = " false " dataType = " Compare " msg = " 年龄必须在18以上 " to1 = " 18 " operator = " GreaterThanEqual " ></ td > 409 </ tr > 410 < tr > 411 < td > 电话: </ td >< td >< input name = " Phone " require = " false " dataType = " Phone " msg = " 电话号码不正确 " ></ td > 412 </ tr > 413 < tr > 414 < td > 手机: </ td >< td >< input name = " Mobile " require = " false " dataType = " Mobile " msg = " 手机号码不正确 " ></ td > 415 </ tr > 416 < tr > 417 < td > 生日: </ td >< td >< input name = " Birthday " dataType = " Date " format = " YMD " msg = " 生日日期不存在 " ></ td > 418 </ tr > 419 < tr > 420 < td > 邮政编码: </ td >< td >< input name = " Zip " dataType = " Custom " regexp = " ^[1-9]\d{5}$ " msg = " 邮政编码不存在 " ></ td > 421 </ tr > 422 < tr > 423 < td > 邮政编码: </ td >< td >< input name = " Zip1 " dataType = " Zip " msg = " 邮政编码不存在 " ></ td > 424 </ tr > 425 < tr > 426 < 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 > 427 </ tr > 428 < tr > 429 < 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 > 430 </ tr > 431 < tr > 432 < 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 > 433 </ tr > 434 < tr > 435 < td > 自我介绍: </ td >< td >< textarea name = " Description " dataType = " Limit " max = " 10 " msg = " 自我介绍内容必须在10个字之内 " > 中文是一个字 </ textarea ></ td > 436 </ tr > 437 < tr > 438 < td > 自传: </ td >< td >< textarea name = " History " dataType = " LimitB " min = " 3 " max = " 10 " msg = " 自传内容必须在[3~10]个字节之内 " > 中文是两个字节t </ textarea ></ td > 439 </ tr > 440 < tr > 441 < td colspan = " 2 " >< input name = " Submit " type = " submit " value = " 确定提交 " ></ td > 442 </ tr > 443 </ table > 444 </ form > 445 < % 446 Dim V : Set V = New Validator 447 V.Mode = 3 448 V.Method = " XMLHTTP" 449 V.Validate() 450 Set V = Nothing 451 % > 452 </ body > 453 </ html >