请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 180357|回复: 90

表单验证Validator3.0测试 [复制链接]

我佛山人 楼主

我佛·山人

荣誉管理 手机认证 

帖子
2368
体力
22823
威望
85
居住地
北京市 朝阳区
发表于 2004-11-24 11:57:00 |显示全部楼层
本帖进行了分割以前的回帖请看 1~100,101~200
本来想等3.0的文档写完再发布的,既然现在顶上来,就先作个3.0的链接吧.Validator 2.0是个失败的作品,所以一直是beta版.酝酿了十几个月,根据这一年以来对表单验证处理方面的经验,重新写了3.0.3.0目前仍然是测试中,不过这并不影响正常使用,实际上,我已经应用在好几个项目中了,只是觉得有些东西还应该做得更好,因此一直没有正式发布.现在公开,目的是希望大家在测试中能提出好的建议

3.0测试演示地址:
http://www.wfsr.net/validator/index.html

3.0的构架已经完全改变,可配置性更高,不过不兼容1.x和2.0,但是只需要作少量修改就可以安全升级至3.0.
1.属性名.
3.0的属性名除id及name外,首字母全部改用大写,比如dataType改为DataType,require改为Require.另外,msg改为Message.
2.Validator.Setup
需要手动调用该方法,告诉程序当前页需要应用Validator的表单及相关设置,具体可参见演示.

to be continued...

表单的验证一直是网页设计者头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。
Validator是基于JavaScript技术的伪静态类和对象的自定义属性,可以对网页中的表单项输入进行相应的验证,允许同一页面中同时验证多个表单,熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。因为是伪静态类,所以在调用时不需要实例化,直接以"类名+.语法+属性或方法名"来调用。此外,Validator还提供3种不同的错误提示模式,以满足不同的需要。

[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文件:

Validator.CHM下载

示例:

 提示:您可以先修改部分代码再运行




更新历史:

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

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

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

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


[PHP]版

  1.   <title>表单验证类 Validator for PHP β</title>
  2. <style>
  3. body,td{font:normal 12px Verdana;color:#333333}
  4. input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
  5. table{border-collapse:collapse;}
  6. td{padding:3px}
  7. input{height:20;}
  8. textarea{width:80%;height:50px;overfmin:auto;}
  9. form{display:inline}
  10. </style>
  11. <table align="center">
  12. <form action="Validator.php" method="post">
  13.   <tr>
  14.    <td>提示模式:</td><td>
  15.    <select name="emode">
  16.    <option value="1">警告提示框(客户端)</option>
  17.    <option value="2">提示框加红色文字提示</option>
  18.    <option value="3">附加红色提示</option>
  19.    <option value="4">警告提示框(服务器端)</option>
  20.    <option value="5">文字提示(服务器端)</option>
  21.    </select></td>
  22.   </tr>
  23.   <tr>
  24.    <td>真实姓名:</td><td><input name="Name"></td>
  25.   </tr>
  26.   <tr>
  27.    <td>英文名:</td><td><input name="Nick"></td>
  28.   </tr>
  29.     <tr>
  30.    <td>主页:</td><td><input name="Homepage"></td>
  31.   </tr>
  32.   <tr>
  33.    <td>密码:</td><td><input name="Password"></td>
  34.   </tr>
  35.   <tr>
  36.    <td>重复:</td><td><input name="Repeat"></td>
  37.   </tr>
  38.   <tr>
  39.    <td>信箱:</td><td><input name="Email"></td>
  40.   </tr>
  41.     <tr>
  42.    <td>信箱:</td><td><input name="Email1"></td>
  43.   </tr>
  44.   <tr>
  45.    <td>QQ:</td><td><input name="QQ"></td>
  46.   </tr>
  47.     <tr>
  48.    <td>身份证:</td><td><input name="Card"></td>
  49.   </tr>
  50.   <tr>
  51.    <td>年龄:</td><td><input name="Year"></td>
  52.   </tr>
  53.    <tr>
  54.    <td>年龄1:</td><td><input name="Year1"></td>
  55.   </tr>
  56.    <tr>
  57.    <td>电话:</td><td><input name="Phone"></td>
  58.   </tr>
  59.    <tr>
  60.    <td>手机:</td><td><input name="Mobile"></td>
  61.   </tr>
  62.      <tr>
  63.    <td>生日:</td><td><input name="Birthday"></td>
  64.   </tr>
  65.    <tr>
  66.    <td>邮政编码:</td><td><input name="Zip"></td>
  67.   </tr>
  68.   <tr>
  69.    <td>邮政编码:</td><td><input name="Zip1"></td>
  70.   </tr>
  71.   <tr>
  72.    <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>
  73.   </tr>
  74.   <tr>
  75.    <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>
  76.   </tr>
  77.   <tr>
  78.    <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>
  79.   </tr>
  80.    <td>自我介绍:</td><td><textarea name="Description">中文是一个字</textarea></td>
  81.   </tr>
  82.      <td>自传:</td><td><textarea name="History">中文是两个字节t</textarea></td>
  83.   </tr>
  84.   <tr>
  85.    <td colspan="2"><input name="Submit" type="submit" value="确定提交"></td>
  86.   </tr>
  87.   </form>
  88. </table>
  89. <script defer>
  90. /*************************************************
  91.         Validator for PHP  β 客户端脚本
  92.         code by 我佛山人
  93.         wfsr@cunite.com
  94.         http://www.cunite.com
  95. *************************************************/
  96. function dispError(items, messages, mode, separator){
  97.         var iArray = items.split(separator);
  98.         for(var i=iArray.length-1;i>=0;i--)
  99.                 iArray[i] = getObj(iArray[i]);
  100.         messages = ("以下原因导致提交失败:\t\t\t\t" + separator + messages).split(separator);
  101.         switch(mode){
  102.                 case 2 :
  103.                         for(i=iArray.length-1;i>=0;i--)
  104.                                 iArray[i].style.color = "red";
  105.                 case 1 :
  106.                         alert(messages.join("\n"));
  107.                         iArray[0].focus();
  108.                         break;
  109.                 case 3 :
  110.                         for(i=iArray.length-1;i>=0;i--){
  111.                                 try{
  112.                                         var span = document.createElement("SPAN");
  113.                                         span.id = "__ErrorMessagePanel";
  114.                                         span.style.color = "red";
  115.                                         iArray[i].parentNode.appendChild(span);
  116.                                         span.innerHTML = messages[i+1].replace(/\d+:/,"*");
  117.                                 }
  118.                                 catch(e){alert(e.description);}
  119.                         }
  120.                         iArray[0].focus();
  121.                         break;
  122.         }
  123. }

  124. function getObj(name){
  125.         var objs = document.getElementsByName(name);
  126.         return objs[objs.length -1];
  127. }
  128. </script>
  129. <?php
  130. class Validator{
  131. /*************************************************
  132.         Validator for PHP  β 服务器端脚本
  133.         code by 我佛山人
  134.         wfsr@cunite.com
  135.         http://www.cunite.com
  136. *************************************************/
  137.         var $submit;
  138.         var $error_item, $error_message, $error_mode, $error_no;
  139.         function Validator($submit_name = "Submit", $mode = 5){
  140.                 $this->submit = $submit_name;
  141.                 $this->error_mode = $mode;
  142.                 $this->error_no = 1;
  143.         }

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

  154.                 if($this->error_no > 1)       
  155.                         $this->display_error();
  156.         }

  157.         function is_valid($str){
  158.                 $str = split(",", $str);
  159.                 if(count($str) < 3) return false;
  160.                 $name = trim($str[0]);
  161.                 $message = trim($str[1]);
  162.                 $data_type = trim($str[2]);
  163.                 $value = trim($_POST[$name]);

  164.                 switch($data_type){
  165.                         case "compare" :
  166.                                 break;
  167.                         case "range" :
  168.                                 break;
  169.                         case "repeat" :
  170.                                 break;
  171.                         default :
  172.                                 $method = "is_".$data_type;
  173.                                 if(!$this->$method($value))
  174.                                         $this->add_error($name, $message);
  175.                                 break;
  176.                 }
  177.         }

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

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

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

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

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

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

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

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

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

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

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

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

  229.         function is_safe($str){
  230.                 return (preg_match("/^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/", $str) != 0);
  231.         }
  232. }
  233. $v = new Validator();
  234. $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"));
  235. ?>
复制代码




[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.         Private Sub Class_Initialize()
  14.                 Set Re = New RegExp
  15.                 Re.IgnoreCase = True
  16.                 Re.Global = True
  17.                 Set Dic = CreateObject("Scripting.Dictionary")
  18.                 Separator = ","
  19.                 ErrorItem = ""
  20.                 ErrorMessage = ""
  21.                 ErrorMode = 5
  22.                 ErrorNo = 1
  23.                 FilePath = Server.MapPath(Request.ServerVariables("Script_Name"))
  24.                 GetMethod = "FSO"
  25.         End Sub

  26.         Private Sub Class_Terminate()
  27.                 Set Re = Nothing
  28.                 Dic.RemoveAll()
  29.                 Set Dic = Nothing
  30.         End Sub

  31.         Public Sub Validate()
  32.                 IF Request("Submit")="" Then        Exit Sub
  33.                 IF Not IsValidPost() Then        Exit Sub

  34.                 With Dic
  35.                         .Add "Compare", "Compare( PostValue, operator, toObj)"
  36.                         .Add "Custom", "Custom( PostValue,regexp )"
  37.                         .Add "Date", "IsDateFormat( PostValue,format )"
  38.                         .Add "Limit", "Limit( PostValue,min, max )"
  39.                         .Add "LimitB", "LimitB( PostValue,min, max )"
  40.                         .Add "Range", "Range( PostValue,min, max )"
  41.                         .Add "Repeat", "IsEqual( PostValue, Request(toObj) )"
  42.                         .Add "Group", "Group( PostValue,min, max )"

  43.                         .Add "NotEqual", "Op1 <> Op2"
  44.                         .Add "GreaterThan", "Op1 > Op2"
  45.                         .Add "GreaterThanEqual", "Op1 >= Op2"
  46.                         .Add "LessThan", "Op1 < Op2"
  47.                         .Add "LessThanEqual", "Op1 <= Op2"
  48.                         .Add "Equal", "Op1 = Op2"
  49.                 End With

  50.                 Call MatchCode()

  51.                 IF ErrorMessage <> "" Then DisplayError
  52.         End Sub

  53.         Private Sub MatchCode()
  54.                 Dim bI, bG, bM
  55.                 Dim Str

  56.                 Select Case GetMethod
  57.                         Case "FSO" :
  58.                                 Dim FSO : Set FSO = Server.CreateObject("Scripting.FileSystemObject")
  59.                                 Set TS = FSO.OpenTextFile(FilePath, 1, false)
  60.                                 Str = TS.ReadAll()
  61.                                 TS.Close
  62.                                 Set TS = Nothing
  63.                                 Set FSO = Nothing
  64.                         Case "XMLHTTP" :
  65.                                 Dim XHttp : Set XHttp = Server.CreateObject("MSXML2.XMLHTTP")
  66.                                 With XHttp
  67.                                         Call .Open("Get", "http://"&Request.ServerVariables("Server_Name")&Request.ServerVariables("Script_Name"), False)
  68.                                         Call .Send()
  69.                                         Str =B2S(.responseBody)
  70.                                 End With
  71.                                 Set XHttp = Nothing
  72.                 End Select
  73.                 Dim itemString
  74.                 With Re
  75.                         bI = .IgnoreCase
  76.                         bG = .Global
  77.                         bM = .MultiLine
  78.                         .IgnoreCase = True
  79.                         .Global = True
  80.                         .Pattern = "[\s\S]*<form [^>]+>([\s\S]+)<\/form>[\s\S]*"
  81.                         Str = .Replace(Str, "$1")

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

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

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

  96.                                 Dim Matches : Set Matches = .Execute(itemString)
  97.                                 Dim Match, RetStr : RetStr = ""
  98.                                    For Each Match in Matches
  99.                                           RetStr = RetStr & Match.Value & " : "
  100.                                    Next
  101.                                 Call IsValid(Replace(Replace(Replace(RetStr, " : $", ""), "to=", "toObj="), """Require""", """NotEmpty"""))
  102.                         Wend
  103.                         .IgnoreCase = bI
  104.                         .Global = bG
  105.                         .MultiLine = bM

  106.                 End With
  107.         End Sub

  108.         Private Sub IsValid(ByVal Str)
  109.                 Dim name, msg, dataType, toObj, min, max, require, regexp, format
  110.                 min = 1 : max = 100 : require = "true" : format = "YMD"
  111.                 Execute Str
  112.                 Dim PostValue : PostValue = Request(name)
  113.                 Dim Fun
  114.                
  115.                 IF require = "false" AND PostValue = "" Then Exit Sub

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  169.         Public Function IsNotEmpty(ByVal Str)
  170.                 IsNotEmpty = LenB(Str) > 0
  171.         End Function

  172.         Public Function IsDateFormat(ByVal Str, ByVal Format)
  173.                 IF Not IsDate(Str) Then
  174.                         IsDateFormat = False
  175.                         Exit Function
  176.                 End IF

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

  183.         Public Function IsEqual(ByVal Src, ByVal Tar)
  184.                 IsEqual = (Src = Tar)
  185.         End Function

  186.         Public Function Compare(ByVal Op1, ByVal Operator, ByVal Op2)
  187.                 Compare = False
  188.                 IF Dic.Exists(Operator) Then
  189.                         Compare = Eval(Dic.Item(Operator))
  190.                         Elseif IsNotEmpty(Op1) Then
  191.                                 Compare = Eval(Op1 &  Operator & Op2 )
  192.                 End IF
  193.         End Function

  194.         Public Function Range(ByVal Src, ByVal Min, ByVal Max)
  195.                 Min = CInt(Min) : Max = CInt(Max)
  196.                 Range = (Min < Src And Src < Max)
  197.         End Function

  198.         Public Function Group(ByVal Src, ByVal Min, ByVal Max)
  199.                 Min = CInt(Min) : Max = CInt(Max)
  200.                 Dim Num : Num = UBound(Split(Src, ",")) + 1
  201.                 Group = Range(Num, Min - 1, Max + 1)
  202.         End Function

  203.         Public Function Custom(ByVal Str, ByVal Reg)
  204.                 Custom = Test(Reg, Str)
  205.         End Function

  206.         Public Function Limit(ByVal Str, ByVal Min, ByVal Max)
  207.                 Min = CInt(Min) : Max = CInt(Max)
  208.                 Dim L : L = Len(Str)
  209.                 Limit = (Min <= L And L <= Max)
  210.         End Function

  211.         Public Function LimitB(ByVal Str, ByVal Min, ByVal Max)
  212.                 Min = CInt(Min) : Max = CInt(Max)
  213.                 Dim L : L =bLen(Str)
  214.                 LimitB = (Min <= L And L <= Max)
  215.         End Function

  216.         Private Function Test(ByVal Pattern, ByVal Str)
  217.                 Re.Pattern = Pattern
  218.                 Test = Re.Test(Str)
  219.         End Function

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

  223.         Private Function Replace(ByVal Str, ByVal Pattern, ByVal ReStr)
  224.                 Re.Pattern = Pattern
  225.                 Replace =         Re.Replace(Str, ReStr)
  226.         End Function

  227.         Private Function B2S(ByVal iStr)
  228.                 Dim reVal : reVal= ""
  229.                 Dim i, Code, nCode
  230.                 For i = 1 to LenB(iStr)
  231.                         Code = AscB(MidB(iStr, i, 1))
  232.                         IF Code < &h80 Then
  233.                                 reVal = reVal & Chr(Code)
  234.                         Else
  235.                                 nCode = AscB(MidB(iStr, i+1, 1))
  236.                                 reVal = reVal & Chr(CLng(Code) * &h100 + CInt(nCode))
  237.                                 i = i + 1
  238.                         End IF
  239.                 Next
  240.                 B2S = reVal
  241.         End Function

  242.         Private Sub AddError(ByVal Name, ByVal Message)
  243.                 ErrorItem = ErrorItem & Separator & Name
  244.                 ErrorMessage = ErrorMessage & Separator & ErrorNo & ":" & Message
  245.                 ErrorNo = ErrorNo + 1
  246.         End Sub

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

  252.         Public Property Let Mode(ByVal Val)
  253.                 ErrorMode = CInt(Val)
  254.         End Property

  255.         Public Property Let Form(ByVal Val)
  256.                 IF IsNumeric(Val) Then
  257.                         FormIndex = Val
  258.                 Else
  259.                         FormName = Val
  260.                 End IF
  261.         End Property

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

  269.         Public Property Let Method(ByVal Val)
  270.                 GetMethod = Val
  271.         End Property
  272. End Class
  273. %>
  274. <title>表单验证类 Validator v1.0</title>
  275. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  276. <style>
  277. body,td{font:normal 12px Verdana;color:#333333}
  278. input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
  279. table{border-collapse:collapse;}
  280. td{padding:3px}
  281. input{height:20;}
  282. textarea{width:80%;height:50px;overfmin:auto;}
  283. form{display:inline}
  284. </style>
  285. <script>
  286. /*************************************************
  287.         Validator for ASP beta 2 客户端脚本
  288.         code by 我佛山人
  289.         wfsr@cunite.com
  290.         http://www.cunite.com
  291. *************************************************/
  292. function dispError(items, messages, mode, separator){
  293.         var iArray = items.split(separator);
  294.         for(var i=iArray.length-1;i>=0;i--)
  295.                 iArray[i] = getObj(iArray[i]);
  296.         messages = ("以下原因导致提交失败:\t\t\t\t" + separator + messages).split(separator);
  297.         switch(mode){
  298.                 case 2 :
  299.                         for(i=iArray.length-1;i>=0;i--)
  300.                                 iArray[i].style.color = "red";
  301.                 case 1 :
  302.                         alert(messages.join("\n"));
  303.                         iArray[0].focus();
  304.                         break;
  305.                 case 3 :
  306.                         for(i=iArray.length-1;i>=0;i--){
  307.                                 try{
  308.                                         var span = document.createElement("SPAN");
  309.                                         span.id = "__ErrorMessagePanel";
  310.                                         span.style.color = "red";
  311.                                         iArray[i].parentNode.appendChild(span);
  312.                                         span.innerHTML = messages[i+1].replace(/\d+:/,"*");
  313.                                 }
  314.                                 catch(e){alert(e.description);}
  315.                         }
  316.                         iArray[0].focus();
  317.                         break;
  318.         }
  319. }

  320. function getObj(name){
  321.         var objs = document.getElementsByName(name);
  322.         return objs[objs.length -1];
  323. }
  324. </script>
  325. <form name="theForm" id="demo" action="" method="post" onSubmit="return true">
  326. <table align="center">
  327.     <tr>
  328.    <td>真实姓名:</td><td><input name="Name" dataType="Chinese" msg="真实姓名只允许中文"></td>
  329.   </tr>
  330.   <tr>
  331.    <td>英文名:</td><td><input name="Nick" dataType="English" require="false" msg="英文名只允许英文字母"></td>
  332.   </tr>
  333.     <tr>
  334.    <td>主页:</td><td><input name="Homepage" require="false" dataType="Url"   msg="非法的Url"></td>
  335.   </tr>
  336.   <tr>
  337.    <td>密码:</td><td><input name="Password" dataType="Safe"   msg="密码不符合安全规则" type="password"></td>
  338.   </tr>
  339.   <tr>
  340.    <td>重复:</td><td><input name="Repeat" dataType="Repeat" to="Password" msg="两次输入的密码不一致" type="password"></td>
  341.   </tr>
  342.   <tr>
  343.    <td>信箱:</td><td><input name="Email" dataType="Email" msg="信箱格式不正确"></td>
  344.   </tr>
  345.     <tr>
  346.    <td>信箱:</td><td><input name="Email1" dataType="Repeat" to="Email" msg="两次输入的信箱不一致"></td>
  347.   </tr>
  348.   <tr>
  349.    <td>QQ:</td><td><input name="QQ" require="false" dataType="QQ" msg="QQ号码不存在"></td>
  350.   </tr>
  351.     <tr>
  352.    <td>身份证:</td><td><input name="Card" dataType="IdCard" msg="身份证号码不正确"></td>
  353.   </tr>
  354.   <tr>
  355.    <td>年龄:</td><td><input name="Year" dataType="Range" msg="年龄必须在18~28之间" min="18" max="28"></td>
  356.   </tr>
  357.    <tr>
  358.    <td>年龄1:</td><td><input name="Year1" require="false" dataType="Compare" msg="年龄必须在18以上" to1="18" operator="GreaterThanEqual"></td>
  359.   </tr>
  360.    <tr>
  361.    <td>电话:</td><td><input name="Phone" require="false" dataType="Phone" msg="电话号码不正确"></td>
  362.   </tr>
  363.    <tr>
  364.    <td>手机:</td><td><input name="Mobile" require="false" dataType="Mobile" msg="手机号码不正确"></td>
  365.   </tr>
  366.      <tr>
  367.    <td>生日:</td><td><input name="Birthday" dataType="Date" format="YMD" msg="生日日期不存在"></td>
  368.   </tr>
  369.    <tr>
  370.    <td>邮政编码:</td><td><input name="Zip" dataType="Custom" regexp="^[1-9]\d{5}$" msg="邮政编码不存在"></td>
  371.   </tr>
  372.   <tr>
  373.    <td>邮政编码:</td><td><input name="Zip1" dataType="Zip" msg="邮政编码不存在"></td>
  374.   </tr>
  375.   <tr>
  376.    <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>
  377.   </tr>
  378.   <tr>
  379.    <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>
  380.   </tr>
  381.   <tr>
  382.    <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>
  383.   </tr>
  384.   <tr>
  385.    <td>自我介绍:</td><td><textarea name="Description" dataType="Limit" max="10"  msg="自我介绍内容必须在10个字之内">中文是一个字</textarea></td>
  386.   </tr>
  387.   <tr>
  388.      <td>自传:</td><td><textarea name="History" dataType="LimitB" min="3" max="10"  msg="自传内容必须在[3~10]个字节之内">中文是两个字节t</textarea></td>
  389.   </tr>
  390.   <tr>
  391.    <td colspan="2"><input name="Submit" type="submit" value="确定提交"></td>
  392.   </tr>
  393. </table>
  394. </form>
  395. <%
  396.         Dim V : Set V = New Validator
  397.         V.Mode = 3
  398.         V.Method = "XMLHTTP"
  399.         V.Validate()
  400.         Set V = Nothing
  401. %>
  402. </body>
  403. </html>
复制代码
已有 1 人评分威望 收起 理由
经典论坛大妈 + 4 历史打分

总评分: 威望 + 4   查看全部评分

西部数码顶级域名注册商39元抢注!

经典圣僧

荣誉管理 手机认证 

帖子
7052
体力
25977
威望
328
居住地
广东省 广州市
发表于 2004-11-25 01:35:00 |显示全部楼层

表单验证 Validator v2.0 beta

借个地方用用(by 我佛山人)
增加功能(在包含旧版功能基础上):
1. IP地址验证
2.多条件验证(还不够完善),只需要在validation.xml中多写一行<item name....>
3.通过 XHTML Strict验证
演示:
http://wishwing.net/Validator.htm

下载:
http://wishwing.net/Validator.rar
2.0 是基于XML的架构,项目的所有页面的表单验证信息都可以保存在Validation.xml文件里,格式:
  1. <?xml version="1.0" encoding="gb2312"?>
  2. <formset>
  3.         <form name="demo" path="/validator.htm">
  4.                 <item name="Card" dataType="IdCard" msg="身份证号错误" />
  5.         </form>
  6. </formset>
复制代码


其中 form 的 name 值是站点根目录下 validator.htm 文件里 id 为 demo 的表单
item 的 name 同表单项的 name ,其它属性同旧版,不同之处是把原来写在表单项的自定义属性移到 XML 配置文件里

脚本部分代码:
  1. /*
  2. Validator v2.0 beta
  3. code by 我佛山人
  4. */
  5. var XmlReader = function(){
  6.         this.GetHttpRequest = function(){
  7.                 if (window.XMLHttpRequest)                // Gecko
  8.                         return new XMLHttpRequest();
  9.                 else if (window.ActiveXObject)        // IE
  10.                         return new ActiveXObject("MsXml2.XmlHttp") ;
  11.         }
  12.         this.LoadUrl = function(urlToCall, asyncFunctionPointer){
  13.                 var oXmlReader = this;
  14.                 var bAsync = (typeof(asyncFunctionPointer) == "function");

  15.                 var oXmlHttp = this.GetHttpRequest();       
  16.                 oXmlHttp.open("GET", urlToCall, bAsync);
  17.                 if (bAsync){       
  18.                         oXmlHttp.onreadystatechange = function()
  19.                         {
  20.                                 if (oXmlHttp.readyState == 4){
  21.                                         oXmlReader.DOMDocument = oXmlHttp.responseXML;
  22.                                         if (oXmlHttp.status == 200)
  23.                                                 asyncFunctionPointer( oXmlReader ) ;
  24.                                         else
  25.                                                 alert("XML request error: " + oXmlHttp.statusText + " (" + oXmlHttp.status + ")" ) ;
  26.                                 }
  27.                         }
  28.                 }
  29.                
  30.                 oXmlHttp.send(null) ;
  31.                
  32.                 if (!bAsync)
  33.                 {
  34.                         if (oXmlHttp.status == 200)
  35.                                 this.DOMDocument = oXmlHttp.responseXML ;
  36.                         else
  37.                         {
  38.                                 alert("XML request error: " + oXmlHttp.statusText + " (" + oXmlHttp.status + ")") ;
  39.                         }
  40.                 }
  41.         }
  42.         this.SelectNodes = function(xpath){
  43.                 if (document.all)                // IE
  44.                         return this.DOMDocument.selectNodes(xpath) ;
  45.                 else{                                        // Gecko
  46.                         var aNodeArray = new Array();

  47.                         var xPathResult = this.DOMDocument.evaluate(xpath, this.DOMDocument, this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;
  48.                         if (xPathResult){
  49.                                 var oNode = xPathResult.iterateNext() ;
  50.                                 while(oNode){
  51.                                         aNodeArray[aNodeArray.length] = oNode ;
  52.                                         oNode = xPathResult.iterateNext();
  53.                                 }
  54.                         }
  55.                         return aNodeArray ;
  56.                 }
  57.         }
  58.         this.SelectSingleNode = function(xpath){
  59.                 if (document.all)                // IE
  60.                         return this.DOMDocument.selectSingleNode( xpath ) ;
  61.                 else{                                        // Gecko
  62.                         var xPathResult = this.DOMDocument.evaluate( xpath, this.DOMDocument,
  63.                                         this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), 9, null);

  64.                         if (xPathResult && xPathResult.singleNodeValue)
  65.                                 return xPathResult.singleNodeValue ;
  66.                         else       
  67.                                 return null ;
  68.                 }
  69.         }
  70. }
  71. Validator = {
  72.         Require : /.+/,
  73.         Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
  74.         Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
  75.         Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/,
  76.         Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
  77.         IP : /^(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])$/,
  78.         IdCard : "Validator.IsIdCard(value)",
  79.         Currency : /^\d+(\.\d+)?$/,
  80.         Number : /^\d+$/,
  81.         Zip : /^[1-9]\d{5}$/,
  82.         QQ : /^[1-9]\d{4,8}$/,
  83.         Integer : /^[-\+]?\d+$/,
  84.         Double : /^[-\+]?\d+(\.\d+)?$/,
  85.         English : /^[A-Za-z]+$/,
  86.         Chinese :  /^[\u0391-\uFFE5]+$/,
  87.         Username : /^[a-z]\w{3,}$/i,
  88.         UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
  89.         IsSafe : function(str){return !this.UnSafe.test(str);},
  90.         SafeString : "Validator.IsSafe(value)",
  91.         Filter : "Validator.DoFilter(value, getAttribute('accept'))",
  92.         Limit : "Validator.limit(value.length,getAttribute('min'),  getAttribute('max'))",
  93.         LimitB : "Validator.limit(Validator.LenB(value), getAttribute('min'), getAttribute('max'))",
  94.         Date : "Validator.IsDate(value, getAttribute('min'), getAttribute('format'))",
  95.         Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
  96.         Range : "getAttribute('min') < (value|0) && (value|0) < getAttribute('max')",
  97.         Compare : "Validator.compare(value,getAttribute('operator'),getAttribute('to'))",
  98.         Custom : "Validator.Exec(value, getAttribute('regexp'))",
  99.         Group : "Validator.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
  100.         ErrorItem : [document.forms[0]],
  101.         ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
  102.         Validate : function(theForm, mode){
  103.                 this.obj = theForm || event.srcElement;
  104.                 this.ErrorMessage.length = 1;
  105.                 this.ErrorItem.length = 1;
  106.                 this.ErrorItem[0] = this.obj;
  107.                 Validator.Check = function (xml){
  108.                         var obj = Validator.obj;
  109.                         var items = xml.SelectNodes("//form[@path='" + location.pathname.toLowerCase() + "' and @name='" + obj.id + "']/item");
  110.                         var iLen = items.length;
  111.                         for(var i=0;i<iLen;i++){
  112.                                 with(items[i]){
  113.                                         var _dataType = getAttribute("dataType");
  114.                                         var value = Validator.getValue(getAttribute("name"));
  115.                                         if(typeof(_dataType) == "object" || typeof(Validator[_dataType]) == "undefined")  continue;
  116.                                         Validator.ClearState(Validator.getObject(getAttribute("name")));
  117.                                         if(getAttribute("require") == "false" && value == "") continue;
  118.                                         switch(_dataType){
  119.                                                 case "IdCard" :
  120.                                                 case "Date" :
  121.                                                 case "Repeat" :
  122.                                                 case "Range" :
  123.                                                 case "Compare" :
  124.                                                 case "Custom" :
  125.                                                 case "Group" :
  126.                                                 case "Limit" :
  127.                                                 case "LimitB" :
  128.                                                 case "SafeString" :
  129.                                                 case "Filter" :
  130.                                                         if(!eval(Validator[_dataType]))        {
  131.                                                                 Validator.AddError(getAttribute("name"), getAttribute("msg"));
  132.                                                         }
  133.                                                         break;
  134.                                                 default :
  135.                                                         if(!Validator[_dataType].test(value)){
  136.                                                                 Validator.AddError(getAttribute("name"), getAttribute("msg"));
  137.                                                         }
  138.                                                         break;
  139.                                         }
  140.                                 }
  141.                         }

  142.                 if(Validator.ErrorMessage.length > 1){
  143.                         mode = mode || 1;
  144.                         var errCount = Validator.ErrorItem.length;
  145.                         switch(mode){
  146.                         case 2 :
  147.                                 for(var i=1;i<errCount;i++)
  148.                                         Validator.ErrorItem[i].style.color = "red";
  149.                         case 1 :
  150.                                 alert(Validator.ErrorMessage.join("\n"));
  151.                                 Validator.ErrorItem[1].focus();
  152.                                 break;
  153.                         case 3 :
  154.                                 for(var i=1;i<errCount;i++){
  155.                                 try{
  156.                                         var span = document.createElement("SPAN");
  157.                                         span.id = "__ErrorMessagePanel";
  158.                                         span.style.color = "red";
  159.                                         Validator.ErrorItem[i].parentNode.appendChild(span);
  160.                                         span.innerHTML = Validator.ErrorMessage[i].replace(/\d+:/,"*");
  161.                                         }
  162.                                         catch(e){alert(e.description);}
  163.                                 }
  164.                                 Validator.ErrorItem[1].focus();
  165.                                 break;
  166.                         default :
  167.                                 alert(Validator.ErrorMessage.join("\n"));
  168.                                 break;
  169.                         }
  170.                         return false;
  171.                 }
  172.                 return true;
  173.                 }
  174.                 new XmlReader().LoadUrl("/Validation.xml", Validator.Check);

  175.         },
  176.         getValue : function(fieldname){
  177.                 return this.getObject(fieldname).value;
  178.         },
  179.         getObject : function(fieldname){
  180.                 var tmpObj = this.obj[fieldname];
  181.                 if(typeof(tmpObj) == "undefined"){alert("不存在名称为" + fieldname + "的表单项");return false;}
  182.                 try{return (tmpObj.length && !tmpObj.tagName)?tmpObj[tmpObj.length-1] : tmpObj;}catch(ie){alert("不存在名称为" + fieldname + "的表单项\nerror:" + ie.description);}
  183.         },
  184.         limit : function(len,min, max){
  185.                 min = min || 0;
  186.                 max = max || Number.MAX_VALUE;
  187.                 return min <= len && len <= max;
  188.         },
  189.         LenB : function(str){
  190.                 return str.replace(/[^\x00-\xff]/g,"**").length;
  191.         },
  192.         ClearState : function(elem){
  193.                 with(elem){
  194.                         if(style.color == "red")
  195.                                 style.color = "";
  196.                         var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
  197.                         if(lastNode.id == "__ErrorMessagePanel")
  198.                                 parentNode.removeChild(lastNode);
  199.                 }
  200.         },
  201.         AddError : function(fieldname, str){
  202.                 Validator.ErrorItem[Validator.ErrorItem.length] = Validator.getObject(fieldname);
  203.                 Validator.ErrorMessage[Validator.ErrorMessage.length] = Validator.ErrorMessage.length + ":" + str;
  204.         },
  205.         Exec : function(op, reg){
  206.                 return new RegExp(reg,"g").test(op);
  207.         },
  208.         compare : function(op1,operator,op2){
  209.                 switch (operator) {
  210.                         case "NotEqual":
  211.                                 return (op1 != op2);
  212.                         case "GreaterThan":
  213.                                 return (op1 > op2);
  214.                         case "GreaterThanEqual":
  215.                                 return (op1 >= op2);
  216.                         case "LessThan":
  217.                                 return (op1 < op2);
  218.                         case "LessThanEqual":
  219.                                 return (op1 <= op2);
  220.                         default:
  221.                                 return (op1 == op2);            
  222.                 }
  223.         },
  224.         MustChecked : function(name, min, max){
  225.                 var groups = this.ErrorItem[0][name];
  226.                 var hasChecked = 0;
  227.                 min = min || 1;
  228.                 max = max || groups.length;
  229.                 for(var i=groups.length-1;i>=0;i-=1)
  230.                         if(groups[i].checked) hasChecked++;
  231.                 return min <= hasChecked && hasChecked <= max;
  232.         },
  233.         DoFilter : function(input, filter){
  234. return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);
  235.         },
  236.         IsIdCard : function(number){
  237.                 var date, Ai;
  238.                 var verify = "10x98765432";
  239.                 var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  240.                 var area = ['','','','','','','','','','','','北京','天津','河北','山西','内蒙古','','','','','','辽宁','吉林','黑龙江','','','','','','','','上海','江苏','浙江','安微','福建','江西','山东','','','','河南','湖北','湖南','广东','广西','海南','','','','重庆','四川','贵州','云南','西藏','','','','','','','陕西','甘肃','青海','宁夏','新疆','','','','','','台湾','','','','','','','','','','香港','澳门','','','','','','','','','国外'];
  241.                 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);
  242.                 if(re == null) return false;
  243.                 if(re[1] >= area.length || area[re[1]] == "") return false;
  244.                 if(re[2].length == 12){
  245.                         Ai = number.substr(0, 17);
  246.                         date = [re[9], re[10], re[11]].join("-");
  247.                 }
  248.                 else{
  249.                         Ai = number.substr(0, 6) + "19" + number.substr(6);
  250.                         date = ["19" + re[4], re[5], re[6]].join("-");
  251.                 }
  252.                 if(!this.IsDate(date, "ymd")) return false;
  253.                 var sum = 0;
  254.                 for(var i = 0;i<=16;i++){
  255.                         sum += Ai.charAt(i) * Wi[i];
  256.                 }
  257.                 Ai +=  verify.charAt(sum%11);
  258.                 return (number.length ==15 || number.length == 18 && number == Ai);
  259.         },
  260.         IsDate : function(op, formatString){
  261.                 formatString = formatString || "ymd";
  262.                 var m, year, month, day;
  263.                 switch(formatString){
  264.                         case "ymd" :
  265.                                 m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
  266.                                 if(m == null ) return false;
  267.                                 day = m[6];
  268.                                 month = m[5]*1;
  269.                                 year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
  270.                                 break;
  271.                         case "dmy" :
  272.                                 m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
  273.                                 if(m == null ) return false;
  274.                                 day = m[1];
  275.                                 month = m[3]*1;
  276.                                 year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
  277.                                 break;
  278.                         default :
  279.                                 break;
  280.                 }
  281.                 if(!parseInt(month)) return false;
  282.                 month = month==0 ?12:month;
  283.                 var date = new Date(year, month-1, day);
  284.         return (typeof(date) == "object" && year == date.getFullYear() && month == (date.getMonth()+1) && day == date.getDate());
  285.                 function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
  286.         }
  287. }
复制代码



这样的好东西怎么不置顶

btw: chm文档中属性regexp和format内容是一样的
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

帖子
184
体力
683
威望
0
发表于 2005-5-30 15:46:00 |显示全部楼层

表单验证Validator2.0 beta

不知道这样写对不对呀,我是新手呀。就这个也是写了大半天的,希望可以帮我看看,小弟感激不尽呀~~~~
一只小天鹅

使用道具 举报

帖子
184
体力
683
威望
0
发表于 2005-5-30 16:37:00 |显示全部楼层

表单验证Validator2.0 beta

你好,我做出来了,你还在吗?想请教一下关于javascript正则表达式是一下问题~~~
一只小天鹅

使用道具 举报

帖子
1
体力
9
威望
0
发表于 2005-5-31 06:29:00 |显示全部楼层

表单验证Validator2.0 beta

;)

使用道具 举报

我佛山人 楼主

我佛·山人

荣誉管理 手机认证 

帖子
2368
体力
22823
威望
85
居住地
北京市 朝阳区
发表于 2005-5-31 08:37:00 |显示全部楼层

表单验证Validator2.0 beta

wenruchun00在上个帖子中说
不知道这样写对不对呀,我是新手呀。就这个也是写了大半天的,希望可以帮我看看,小弟感激不尽呀~~~~


如果你不需要用到具体匹配项,可以换exec换成test

如果内容与本主题无关,最好新开一帖

使用道具 举报

帖子
184
体力
683
威望
0
发表于 2005-5-31 08:46:00 |显示全部楼层

表单验证Validator2.0 beta

我是新手呀,我刚来论坛,不知道怎么看呀,我只是看见那个贴子和我的差不多,我就在那个上面发。你可以告诉我怎么重开一贴吗?小弟请求高手。
一只小天鹅

使用道具 举报

我佛山人 楼主

我佛·山人

荣誉管理 手机认证 

帖子
2368
体力
22823
威望
85
居住地
北京市 朝阳区
发表于 2005-5-31 08:50:00 |显示全部楼层

表单验证Validator2.0 beta

看帖子与论坛广告之间的这个图标

 提示:您可以先修改部分代码再运行

使用道具 举报

独虎 
帖子
753
体力
3573
威望
8
发表于 2005-5-31 08:56:00 |显示全部楼层

表单验证Validator2.0 beta

2.0在我机器上一直无法正常使用 郁闷
直接解压缩后运行提示找不到validator对像,修改js文件路径后 提示xml request err unKnown(2) 任我怎么修改路径都是这样的提示 :( 到底是什么问题呢?
不知道别人下的都能不能正常运行啊

使用道具 举报

帖子
184
体力
683
威望
0
发表于 2005-5-31 08:59:00 |显示全部楼层

表单验证Validator2.0 beta

奥,看到了。谢谢了。我刚才验证
function IsFloat(inputStr){
  if (inputStr == null || inputStr == "") {
    return false;
  }
    var patrn = /^(-?\d+)(\.\d+)?$/;
    return patrn.exec(inputStr);
  }
但是整数怎么也通过呀?
/^(-?\d+)(\.\d+)?$/;这个是验证小数的呀?我问了好多人了,
高手~~请教你了~~~
一只小天鹅

使用道具 举报

帖子
184
体力
683
威望
0
发表于 2005-5-31 09:07:00 |显示全部楼层

表单验证Validator2.0 beta

我的可以正常运行的,你的机子坏了~~~
一只小天鹅

使用道具 举报

fpld 
帖子
3
体力
17
威望
0
发表于 2005-5-31 11:12:00 |显示全部楼层

表单验证Validator2.0 beta

大哥!如果我需要验证的输入框是动态增加的,且多条件验证!那么基于XML该如何验证?

使用道具 举报

我佛山人 楼主

我佛·山人

荣誉管理 手机认证 

帖子
2368
体力
22823
威望
85
居住地
北京市 朝阳区
发表于 2005-5-31 13:37:00 |显示全部楼层

表单验证Validator2.0 beta

to 独虎:忘了说,现在必须要通过HTTP方式访问,因为要用XMLHTTP读取XML数据

to wenruchun00:因为你把\.放到括号里,括号后是一个问号,说明小数点可有可无,怎么改你现在明白了吗?

to fpld :这个要求比较复杂,看来得自己写验证代码了

使用道具 举报

wylon 
帖子
10
体力
43
威望
0
发表于 2005-5-31 15:10:00 |显示全部楼层

表单验证Validator2.0 beta

3q,超支持

使用道具 举报

帖子
184
体力
683
威望
0
发表于 2005-6-1 09:21:00 |显示全部楼层

表单验证Validator2.0 beta

哦,原来这样子呀,明白了,谢谢了,高手~~~
一只小天鹅

使用道具 举报

fpld 
帖子
3
体力
17
威望
0
发表于 2005-6-2 10:50:00 |显示全部楼层

表单验证Validator2.0 beta

to 我佛·山人:
     大哥,如果不用XML 有没有办法进行多条件验证??

使用道具 举报

fpld 
帖子
3
体力
17
威望
0
发表于 2005-6-2 11:18:00 |显示全部楼层

表单验证Validator2.0 beta

to 我佛·山人:
  大哥,有没有MSN ,小弟有些问题想请教一下!:)

使用道具 举报

帖子
113
体力
424
威望
0
发表于 2005-6-14 14:39:00 |显示全部楼层

表单验证Validator2.0 beta

错误提示现在有几种了。
能不能再增加一种  即填完一项即提示。 on的时候提示应该怎么添,OUT 的时候检验是否正确。
学XML及.net
从头开始........

使用道具 举报

hitty 
帖子
2
体力
13
威望
0
发表于 2005-6-16 11:26:00 |显示全部楼层

表单验证Validator2.0 beta

PHP中的:

        function is_safe($str){
                return (preg_match("/^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/", $str) != 0);
        }

表达式错了


另外在2.0中还是出现不能用<script src="XXXXX.js"></script>来引用,原因居然是找不到?

使用道具 举报

hitty 
帖子
2
体力
13
威望
0
发表于 2005-6-16 11:36:00 |显示全部楼层

表单验证Validator2.0 beta

同时其中提交方式应该用POST,很难想像在GET提交下会出现什么状况

其次兼容性也不是太好....

使用道具 举报

帖子
29
体力
62
威望
0
发表于 2005-6-18 15:32:00 |显示全部楼层

表单验证Validator2.0 beta

就算不知其好也支持持一下

使用道具 举报

帖子
81
体力
302
威望
0
发表于 2005-7-5 15:43:00 |显示全部楼层

表单验证Validator2.0 beta

下载后在机器上测试怎么有错呢?测试环境:win2k+iis5.0


Microsoft VBScript 运行时错误 错误 '800a01b6'

对象不支持此属性或方法: 'MultiLine'

/admins/test.asp,行93
--------------------------
Call Me Rogue
--------------------------

使用道具 举报

ccqwq 
帖子
75
体力
284
威望
0
发表于 2005-7-15 07:35:00 |显示全部楼层

表单验证Validator2.0 beta

  在鲜花和掌声中向山人质疑:代码中为什么没有注释?
  从我接触代码的第一天起,受教的就是写注释!在这里狂顶的人,大多是我师兄--看的懂全部代码吗?想截取有用的部分,不会!想添加一些类别,不懂!按这里的高人前辈的意思:学好了再来!如果我能精通javascript和正则表达式,Validator2.0 beta还有什么用?
  冒犯之处还请谅解!

使用道具 举报

h819 
帖子
41
体力
146
威望
0
发表于 2005-7-26 10:19:00 |显示全部楼层

表单验证Validator2.0 beta

验证程序非常好

现在不能下载啦,好像那个空间停了

做几个链接地址更好

还有,对 validator 的说明是很重要的

如果 山人 能在一个帖子里说明,就更好了

现在是两个帖子,有点乱
Just do it !

使用道具 举报

amu945 
帖子
1745
体力
13115
威望
47
居住地
重庆市 九龙坡区
发表于 2005-7-26 10:37:00 |显示全部楼层

表单验证Validator2.0 beta

就是,下不到啊!!!
美女车手Victoria Pendleton
http://www.ibiker.net/communion/question.php?id=11

使用道具 举报

qudee 
帖子
100
体力
396
威望
0
发表于 2005-7-27 16:36:00 |显示全部楼层

表单验证Validator2.0 beta

顶..
关注:PHP MYSQL XML XHTML JS CSS DOM
----------------------------------------------
给新手的建议: 找系统的HTML和CSS教程看一遍,至少了解专业的词语,碰到问题可以GOOGLE或百度,接下来找JS的教程看一遍,这三个是网页的基础.
-------------------------------

使用道具 举报

帖子
261
体力
993
威望
0
发表于 2005-8-24 16:17:00 |显示全部楼层

表单验证Validator2.0 beta

ASP的验证类,当被验证表单放在一个包含文件中或者DW的库(Library)中,就会报错:
Microsoft VBScript 编译器错误
错误 '800a03ea':
这一行:IF Not Eval(Fun) Then Call AddError(name,msg)

而单独测试表单和撤销库标签就没有错误

请教楼主。
菜得不得鸟!

使用道具 举报

帖子
45
体力
189
威望
0
发表于 2005-8-27 02:36:00 |显示全部楼层

表单验证Validator2.0 beta

   是个好表单验证代码,但对于初学者就是不太好了,这比较适合高手们用,下面的表单验证代码,我看初学者一定会适应的
<head>中写以下代码:
<script language="javascript">
function check(theform){
if(theform.文本域名称.value==""){
alert("请求内容?")
theform.文本域名称.focus()
return false
}
if (theform.mima.value =="")
{
alert("请填写您的密码!");
theform.mima.focus();
return false;
}
if(theform.mima2.value==""){
alert("请输入您的确认密码!");
theform.mima2.focus();
return false;
}
var filter=/^\s*[.A-Za-z0-9_-]{5,15}\s*$/;
if (!filter.test(theform.mima.value)) {
alert("密码填写不正确,请重新填写!可使用的字符为(A-Z a-z 0-9 _ - .)长度不小于5个字符,不超过15个字符,注意不要使用空格。");
theform.mima.focus();
theform.mima.select();
return false;
}
if (theform.mima.value!=theform.mima2.value ){
alert("两次填写的密码不一致,请重新填写!");
theform.mima.focus();
theform.mima.select();
return false;
}
if (theform.xinxiang.value =="")
{
alert("请输入您的电子邮件地址!");
theform.xinxiang.focus();
theform.xinxiang.select();
return false;
}
var filter=/^\s*([A-Za-z0-9_-]+(\.\w+)*@(\w+\.)+\w{2,3})\s*$/;
if (!filter.test(theform.xinxiang.value)) {
alert("邮件地址不正确,请重新填写!");
theform.xinxiang.focus();
theform.xinxiang.select();
return false;
}
return true
}

</script>


在<form>里写如以下代码:
<form onSubmit="return check(this)">
  不经历风雨,怎么见彩虹!

使用道具 举报

外号牛13

银牌会员 手机认证 

帖子
482
体力
2891
威望
0
居住地
浙江省 温州市
发表于 2005-8-28 02:39:00 |显示全部楼层

表单验证Validator2.0 beta

好东西,以前看是看不懂,现在就明白了。好东西,收藏了~!
认真!
细心!

使用道具 举报

eays 
帖子
612
体力
2115
威望
3
居住地
广东省 佛山市
发表于 2005-8-28 10:30:00 |显示全部楼层

表单验证Validator2.0 beta

好东西,收藏

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 10:48 , Processed in 0.204295 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部