驗證身份證的正則表達式包括15,18 位


//身份證正則表達式(15位)   

isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;   

  

//身份證正則表達式(18位)   

  

isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;

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;

}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章