`
FengShen_Xia
  • 浏览: 279395 次
  • 性别: Icon_minigender_1
  • 来自: 东方水城
社区版块
存档分类
最新评论

15位和18位身份证的正则表达式及其验证

阅读更多

1、简单的正则表达式:

 

(1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/"
,$id_card) 

(2)preg_match("/^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X)?$/"
,$id_card) 

(3)preg_match("/(^\d{15}$/)|(\d{17}(?:\d|x|X)$/),$id_card)

 

2、复杂并且严格一些的验证:

//这个可以验证15位和18位的身份证,并且包含生日和校验位的验证。   
//如果有兴趣,还可以加上身份证所在地的验证,就是前6位有些数字合法有些数字不合法。 

 
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; 

}   

 

 

3、严格的验证(仅18位):

<script>

var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}

 

function cidInfo(sId){

var iSum=0

var info=""

if(!/^d{17}(d|x)$/i.test(sId))return false;

sId=sId.replace(/x$/i,"a");

if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区";

sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));

var d=new Date(sBirthday.replace(/-/g,"/"))

if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日";

for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)

if(iSum%11!=1)return "Error:非法证号";

return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")

}document.write(cidInfo("380524198002300016"),"<br/>");

document.write(cidInfo("340524198002300019"),"<br/>")

document.write(cidInfo("340524197711111111"),"<br/>")

document.write(cidInfo("34052419800101001x"),"<br/>");

</script>

 

 

分享到:
评论

相关推荐

    正则表达式大全 - 收集的最常用正则表达式

    以下是一些常见的正则表达式及其用途: 1. 匹配中文字符:`[u4e00-u9fa5]` - 这个正则表达式用于匹配所有中文字符,包括简体和繁体。它基于Unicode范围,u4e00到u9fa5涵盖了大部分常用汉字。 2. 匹配双字节字符:`...

    正则表达式(基本包含所有验证的正则)

    这个正则表达式可以匹配15位或18位的身份证号码。 #### 四、正则表达式的特殊应用 除了以上提到的基本应用场景之外,还有一些特殊的正则表达式应用场景需要注意: ##### 1. HTML标签去除 有时我们需要去除一段文本...

    报表工具FineReport正则表达式定义规则

    - 说明:身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。 #### 四、JavaScript中的正则表达式 在JavaScript中使用正则表达式时,需要在正则表达式前后加上...

    javascript正则表达式表单验证大全

    ### JavaScript正则表达式在表单...以上正则表达式及其应用,覆盖了从基本数据类型验证到更复杂的数据处理需求,是JavaScript前端开发中不可或缺的工具。掌握这些技巧,可以显著提升Web应用程序的健壮性和用户体验。

    各种正则表达式验证有数字英文中文符号

    验证中国居民身份证号码,包括15位和18位两种格式,18位最后两位可以是数字或大写字母X。 #### 7. **货币金额格式验证** ```regex Currency:/^\d+(\.\d+)?$/ ``` 用于验证货币金额的格式,包括整数部分和可选的小数...

    实验4 正则表达式及其应用.pdf

    身份证号码的验证规则是长度必须是15位或18位,且最后一位可以是数字或字符'x'或'X'。实现时,可以首先检查长度,然后验证最后一位校验位是否合法。 第三部分则是使用在线测试工具提取正确的IP地址。IP地址由四组...

    正则表达式 正则表达式资料 正则表达式教程

    教程涵盖了正则表达式的基本概念、常用符号及其组合方式等内容。 #### 2.2 regexlab.com的《揭开正则表达式的神秘面纱》 该资源提供了详细的讲解和实例,排版清晰整洁。无论是正准备入门的新手还是希望进一步提升...

    正则表达式大全.txt

    这些知识点涵盖了不同类型的正则表达式的构建方法及其用途,对于理解和应用正则表达式非常有帮助。 ### 正则表达式概述 正则表达式(Regular Expression)是一种强大的文本处理工具,在字符串查找、替换等操作中...

    常用各类验证 正则表达式

    此正则表达式可以验证15位或18位的身份证号码,同时也支持最后一位是大写X的情况。 #### 5. 常用数字验证 对于纯数字的验证,可以采用以下简单的方式: ```javascript /^\d+$/ ``` 这个正则表达式可以确保输入的...

    正则表达式II 正则表达式

    通过以上介绍,我们不仅了解了正则表达式的基本概念和构成要素,还深入学习了一些高级特性及其应用场景。掌握这些知识点将有助于我们在实际开发工作中更高效地进行字符串的处理和验证工作。无论是简单的字符串匹配...

    正则表达式例子大全

    - 验证身份证号(15位或18位数字):`^\d{15}|\d{18}$` 匹配符合中国大陆身份证号码格式的字符串。 - 验证一年的12个月:`^(0?[1-9]|1[0-2])$` 匹配从“01”到“12”的月份。 - 验证一个月的31天:`^((0?[1-9])|...

    大量的正则表达式代码

    该正则表达式用于验证中国大陆居民身份证号码的有效性,支持15位和18位身份证号的匹配。 #### 2. IP地址匹配 - **IP地址匹配**:`d+.d+.d+.d+` 用于验证标准IPv4地址格式是否正确,例如“192.168.0.1”。 #### ...

    JavaScript常用正则表达式

    以下是一些JavaScript中常见的正则表达式及其应用: 1. 邮箱验证: ```javascript const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; ``` 这个正则表达式用于检查输入的字符串是否符合...

    正则表达式在程序开发中的应用

    - 验证身份证号:`^\d{15}|\d{18}$`。 - 验证月份:`^(0?[1-9]|1[0-2])$`。 - 验证日期:`^((0?[1-9])|((1|2)[0-9])|30|31)$`。 3. **其他应用场景:** - 限制输入只允许输入中文:`onkeyup="value=value....

    js正则表达式验证大全

    本教程将深入探讨JavaScript中的正则表达式及其在验证中的应用。 一、正则表达式基础 1. 创建正则表达式: - 字面量表示法:`/pattern/flags` - 构造函数:`new RegExp('pattern', 'flags')` 2. 常用元字符: ...

    javascript数据校验正则表达式

    这个正则表达式匹配18位的中国身份证号码,或17位后跟x或X的情况。 在实际应用中,我们经常需要自定义正则表达式以满足特定业务需求。`test()`方法用于检查字符串是否符合正则表达式,返回`true`或`false`。此外,...

Global site tag (gtag.js) - Google Analytics