forked from kuafuRace/phprap
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatatype.js
More file actions
executable file
·315 lines (260 loc) · 11.3 KB
/
Copy pathdatatype.js
File metadata and controls
executable file
·315 lines (260 loc) · 11.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
/*
Validform datatype extension
By sean during December 8, 2012 - February 20, 2013
For more information, please visit http://validform.rjboy.cn
扩展以下类型:
date:匹配日期
zh:匹配中文字符
dword:匹配双字节字符
money:匹配货币类型
ipv4:匹配ipv4地址
ipv6:匹配ipv6地址
num:匹配数值型
qq:匹配qq号码
unequal:当前值不能等于被检测的值,如可以用来检测新密码不能与旧密码一样
notvalued:当前值不能包含指定值,如密码不能包含用户名等的检测
min:多选框最少选择多少项
max:多选框最多不能超过多少项
byterange:判断字符长度,中文算两个字符
numrange:判断数值范围,如小于100大于10之间的数
daterange:判断日期范围
idcard:对身份证号码进行严格验证
*/
(function(){
if($.Datatype){
$.extend($.Tipmsg.w,{
"date":"请填写合法日期!",
"en":"必须以英文字母开头,且只含有英文字母、数字和下划线!",
"zh":"请填写中文!",
"dword":"请填写双字节字符!",
"ipv4":"请填写合法的ip地址!",
"ipv6":"请填写IPv6地址!",
"price":"请填写合法的价格!如:1.00",
"qq":"请填写合法的QQ号码!",
"unequal":"值不能相等!",
"notvalued":"不能含有特定值!",
"idcard":"请填写合法的身份证号码!"
});
$.extend($.Datatype,{
/*
reference http://blog.csdn.net/lxcnn/article/details/4362500;
日期格式可以是:20120102 / 2012.01.02 / 2012/01/02 / 2012-01-02
时间格式可以是:10:01:10 / 02:10
如 2012-01-02 02:10
2012-01-02
*/
"date":/^(?:(?:1[6-9]|[2-9][0-9])[0-9]{2}([-/.]?)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:(?:1[6-9]|[2-9][0-9])(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)([-/.]?)0?2\2(?:29))(\s+([01][0-9]:|2[0-3]:)?[0-5][0-9]:[0-5][0-9])?$/,
/*
* 匹配英文字符
*/
"en":/^[a-zA-Z][a-zA-Z0-9_]*$/,
/*
* 匹配中文字符;
*/
"zh":/^[\u4e00-\u9fa5]+$/,
//匹配双字节字符;
"dword":/^[^\x00-\xff]+$/,
//匹配ipv4地址;
"ipv4":/^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$/,
/*
匹配ipv6地址;
reference http://forums.intermapper.com/viewtopic.php?t=452;
*/
"ipv6":/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/,
/*
* 匹配价格
*/
"price":/^[0-9]+[\.][0-9]{0,5}$/,
/*
* 匹配版本号
*/
"version":/^[\d]([\d.]{1,20}){1,20}[\d]$/,
/*
* 匹配QQ号
*/
"qq":/^[1-9][0-9]{4,}$/,
/*
* 匹配QQ号
*/
"url":/^(http|https)\:\/\//,
/*
参数gets是获取到的表单元素值,
obj为当前表单元素,
curform为当前验证的表单,
datatype为内置的一些正则表达式的引用。
*/
"unequal":function(gets,obj,curform,datatype){
/*
当前值不能与指定表单元素的值一样,如新密码不能与旧密码一样,密码不能设置为用户名等
注意需要通过绑定with属性来指定要比较的表单元素,可以是clas,id或者是name属性值
eg. <input type="text" name="name" id="name" class="name" />
eg1. <input type="text" name="test" datatype="unequal" with="name" />
eg2. <input type="text" name="test" datatype="unequal" with=".name" />
eg3. <input type="text" name="test" datatype="unequal" with="#name" />
也可以用来验证不能与with指定的值相等
当上面根据class,id和name都查找不到对象时,会直接跟with的值比较
eg4. <input type="text" name="test" datatype="num unequal" with="100" />
该文本框的值不能等于100
*/
var withele=$.trim(obj.attr("with"));
var val=curform.find(withele+",[name='"+withele+"']").val() || withele;
if(gets==$.trim(val)){
return false;
}
},
"notvalued":function(gets,obj,curform,datatype){
/*
当前文本框的值不能含有指定文本框的值,如注册时设置的密码里不能包含用户名
注意需要给表单元素绑定with属性来指定要比较的表单元素,可以是clas,id或者是name属性值
<input type="text" name="username" id="name" class="name" />
eg. <input type="password" name="test" datatype="notvalued" with=".name" />
也可以用来验证不能包含with指定的值
当上面根据class,id和name都查找不到对象时,会直接跟with的值比较
eg2. <input type="password" name="test" datatype="notvalued" with="validform" />
要求不能含有"validform"字符
*/
var withele=$.trim(obj.attr("with"));
var val=curform.find(withele+",[name='"+withele+"']").val() || withele;
if(gets.indexOf($.trim(val))!=-1){
return false;
}
},
"min":function(gets,obj,curform,datatype){
/*
checkbox最少选择n项
注意需要给表单元素绑定min属性来指定是至少需要选择几项,没有绑定的话使用默认值
eg. <input type="checkbox" name="test" datatype="min" min="3" />
*/
var minim=~~obj.attr("min") || 2,
numselected=curform.find("input[name='"+obj.attr("name")+"']:checked").length;
return numselected >= minim ? true : "请至少选择"+minim+"项!";
},
"max":function(gets,obj,curform,datatype){
/*
checkbox最多选择n项
注意需要给表单元素绑定max属性来指定是最多需要选择几项,没有绑定的话使用默认值
eg. <input type="checkbox" name="test" datatype="max" max="3" />
*/
var atmax=~~obj.attr("max") || 2,
numselected=curform.find("input[name='"+obj.attr("name")+"']:checked").length;
if(numselected==0){
return false;
}else if(numselected>atmax){
return "最多只能选择"+atmax+"项!";
}
return true;
},
"byterange":function(gets,obj,curform,datatype){
/*
判断字符长度,中文算两个字符
注意需要给表单元素绑定max,min属性来指定最大或最小允许的字符长度,没有绑定的话使用默认值
*/
var dregx=/[^\x00-\xff]/g;
var maxim=~~obj.attr("max") || 100000000,
minim=~~obj.attr("min") || 0;
getslen=gets.replace(dregx,"00").length;
if(getslen>maxim){
return "输入字符不能多于"+maxim+"个,中文算两个字符!";
}
if(getslen<minim){
return "输入字符不能少于"+minim+"个,中文算两个字符!";
}
return true;
},
"numrange":function(gets,obj,curform,datatype){
/*
判断数值范围
注意需要给表单元素绑定max,min属性来指定最大或最小可输入的值,没有绑定的话使用默认值
*/
var maxim=~~obj.attr("max") || 100000000,
minim=~~obj.attr("min") || 0;
gets=gets.replace(/\s*/g,"").replace(/,/g,"");
if(!/^\d+\.?\d*$/.test(gets)){
return "只能输入数字!";
}
if(gets<minim){
return "值不能小于"+minim+"!";
}else if(gets>maxim){
return "值不能大于"+maxim+"!";
}
return true;
},
"daterange":function(gets,obj,curform,datatype){
/*
判断日期范围
注意需要给表单元素绑定max或min属性,或两个同时绑定来指定最大或最小可输入的日期
日期格式:2012/12/29 或 2012-12-29 或 2012.12.29 或 2012,12,29
*/
var maxim=new Date(obj.attr("max").replace(/[-\.,]/g,"/")),
minim=new Date(obj.attr("min").replace(/[-\.,]/g,"/")),
gets=new Date(gets.replace(/[-\.,]/g,"/"));
if(!gets.getDate()){
return "日期格式不对!";
}
if(gets>maxim){
return "日期不能大于"+obj.attr("max");
}
if(gets<minim){
return "日期不能小于"+obj.attr("min");
}
return true;
},
"idcard":function(gets,obj,curform,datatype){
/*
该方法由网友提供;
对身份证进行严格验证;
*/
var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];// 加权因子;
var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];// 身份证验证位值,10代表X;
if (gets.length == 15) {
return isValidityBrithBy15IdCard(gets);
}else if (gets.length == 18){
var a_idCard = gets.split("");// 得到身份证数组
if (isValidityBrithBy18IdCard(gets)&&isTrueValidateCodeBy18IdCard(a_idCard)) {
return true;
}
return false;
}
return false;
function isTrueValidateCodeBy18IdCard(a_idCard) {
var sum = 0; // 声明加权求和变量
if (a_idCard[17].toLowerCase() == 'x') {
a_idCard[17] = 10;// 将最后位为x的验证码替换为10方便后续操作
}
for ( var i = 0; i < 17; i++) {
sum += Wi[i] * a_idCard[i];// 加权求和
}
valCodePosition = sum % 11;// 得到验证码所位置
if (a_idCard[17] == ValideCode[valCodePosition]) {
return true;
}
return false;
}
function isValidityBrithBy18IdCard(idCard18){
var year = idCard18.substring(6,10);
var month = idCard18.substring(10,12);
var day = idCard18.substring(12,14);
var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day));
// 这里用getFullYear()获取年份,避免千年虫问题
if(temp_date.getFullYear()!=parseFloat(year) || temp_date.getMonth()!=parseFloat(month)-1 || temp_date.getDate()!=parseFloat(day)){
return false;
}
return true;
}
function isValidityBrithBy15IdCard(idCard15){
var year = idCard15.substring(6,8);
var month = idCard15.substring(8,10);
var day = idCard15.substring(10,12);
var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day));
// 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
if(temp_date.getYear()!=parseFloat(year) || temp_date.getMonth()!=parseFloat(month)-1 || temp_date.getDate()!=parseFloat(day)){
return false;
}
return true;
}
}
});
}else{
setTimeout(arguments.callee,10);
}
})();