身份证号的rule 写法 [ 2.0 版本 ]
正则掌握的不太好,自己写不知道怎么写
共 5 个回答
-
-
如果需要
姓名和身份证 严格匹配
, 需要从公安系统验证, 一般公司是没这个资质的...幸好... 有资格的服务商 提供
api
, 调用一次 大概三块钱左右;如果不用严格匹配... 按身份证数字规则做验证即可. 大概规则 这里给你贴一下
前6位为行政区划分代码 ( 网上很多数据库数据, 你可以下载来作验证 )
第7位至14位为出生日期 (使用
php
函数验证是否是正确日期即可)第15位至17位为顺序码 ( 无法验证 )
第18位为校验码。 (具体验证规则 百度 "身份证最后一位")
你可以根据以上信息, 进行选择性进行验证
共 7 条回复现在 改成 这样的了
['id_number', 'checkIdNum'],
验证函数:
public function checkIdNum($attribute,$params){ //$num = $this->attribute->params; $num = $this->id_number; echo $num; die; $cin = new CheckIdNum(); if($cin->checkIdentity($num)){ return true; }else{ $this->addError($attribute, '请输入正确的身份证号!'); } }
注释:
$cin->checkIdentity($num) 这个是个bool值,我这种写法 没效果 不能验证
-
fantasy2012 回答于 2015-11-20 00:32 举报
实在想验证也可以自己写一个啊,model层或者components里面写个静态方法就好了
有时候自己做轮子比找还快
-
-
function isIdCardNo(num) { num = num.toUpperCase(); //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。 if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) { alert('输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。'); return false; } //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 //下面分别分析出生日期和校验位 var len, re; len = num.length; if (len == 15) { re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/); var arrSplit = num.match(re); //检查生日日期是否正确 var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]); var bGoodDay; bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { alert('输入的身份证号里出生日期不对!'); return false; } else { //将15位身份证转成18位 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var nTemp = 0, i; num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6); for(i = 0; i < 17; i ++) { nTemp += num.substr(i, 1) * arrInt[i]; } num += arrCh[nTemp % 11]; return num; } } if (len == 18) { re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/); var arrSplit = num.match(re); //检查生日日期是否正确 var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); var bGoodDay; bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { alert(dtmBirth.getYear()); alert(arrSplit[2]); alert('输入的身份证号里出生日期不对!'); return false; } else { //检验18位身份证的校验码是否正确。 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 var valnum; var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var nTemp = 0, i; for(i = 0; i < 17; i ++) { nTemp += num.substr(i, 1) * arrInt[i]; } valnum = arrCh[nTemp % 11]; if (valnum != num.substr(17, 1)) { alert('18位身份证的校验码不正确!应该为:' + valnum); return false; } return num; } } return false; }
共 2 条回复
了然听雨
注册时间:2015-06-08
最后登录:2016-04-21
在线时长:12小时34分
最后登录:2016-04-21
在线时长:12小时34分
- 粉丝5
- 金钱435
- 威望0
- 积分555