验证身份证的完整函数 /**/ /* 验证身份证的完整函数(限中国) */ function checkIdcard(idcard) { var Errors = new Array( " 验证通过! " , " 身份证号码位数不对! " , " 身份证号码出生*期超出范围或含有非法字符! " , " 身份证号码校验错误! " , " 身份证地区非法! " ); var area = { 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 : " 国外 " } var idcard,Y,JYM; var S,M; var idcard_array = new Array(); idcard_array = idcard.split( "" ); // 地区检验 if (area[parseInt(idcard.substr( 0 , 2 ))] == null ) return Errors[ 4 ]; // 身份号码位数及格式检验 switch (idcard.length) { case 15 : if ( (parseInt(idcard.substr( 6 , 2 )) + 1900 ) % 4 == 0 || ((parseInt(idcard.substr( 6 , 2 )) + 1900 ) % 100 == 0 && (parseInt(idcard.substr( 6 , 2 )) + 1900 ) % 4 == 0 )) { ereg =/^ [ 1 - 9 ][ 0 - 9 ][ 0 - 9 ](( 01 | 03 | 05 | 07 | 08 | 10 | 12 )( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ] | 3 [ 0 - 1 ]) | ( 04 | 06 | 09 | 11 )( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ] | 30 ) | 02 ( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ]))[ 0 - 9 ]$ / ; // 测试出生*期的合法性 } else { ereg =/^ [ 1 - 9 ][ 0 - 9 ][ 0 - 9 ](( 01 | 03 | 05 | 07 | 08 | 10 | 12 )( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ] | 3 [ 0 - 1 ]) | ( 04 | 06 | 09 | 11 )( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ] | 30 ) | 02 ( 0 [ 1 - 9 ] | 1 [ 0 - 9 ] | 2 [ 0 - 8 ]))[ 0 - 9 ]$ / ; // 测试出生*期的合法性 } if (ereg.test(idcard)) return Errors[ 0 ]; else return Errors[ 2 ]; break ; case 18 : // 18位身份号码检测 // 出生*期的合法性检查 // 闰年月*:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9])) // 平年月*:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8])) if ( parseInt(idcard.substr( 6 , 4 )) % 4 == 0 || (parseInt(idcard.substr( 6 , 4 )) % 100 == 0 && parseInt(idcard.substr( 6 , 4 )) % 4 == 0 )) { ereg =/^ [ 1 - 9 ][ 0 - 9 ] 19 [ 0 - 9 ](( 01 | 03 | 05 | 07 | 08 | 10 | 12 )( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ] | 3 [ 0 - 1 ]) | ( 04 | 06 | 09 | 11 )( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ] | 30 ) | 02 ( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ]))[ 0 - 9 ][ 0 - 9Xx]$ / ; // 闰年出生*期的合法性正则表达式 } else { ereg =/^ [ 1 - 9 ][ 0 - 9 ] 19 [ 0 - 9 ](( 01 | 03 | 05 | 07 | 08 | 10 | 12 )( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ] | 3 [ 0 - 1 ]) | ( 04 | 06 | 09 | 11 )( 0 [ 1 - 9 ] | [ 1 - 2 ][ 0 - 9 ] | 30 ) | 02 ( 0 [ 1 - 9 ] | 1 [ 0 - 9 ] | 2 [ 0 - 8 ]))[ 0 - 9 ][ 0 - 9Xx]$ / ; // 平年出生*期的合法性正则表达式 } if (ereg.test(idcard)) { // 测试出生*期的合法性 // 计算校验位 S = (parseInt(idcard_array[ 0 ]) + parseInt(idcard_array[ 10 ])) * 7 + (parseInt(idcard_array[ 1 ]) + parseInt(idcard_array[ 11 ])) * 9 + (parseInt(idcard_array[ 2 ]) + parseInt(idcard_array[ 12 ])) * 10 + (parseInt(idcard_array[ 3 ]) + parseInt(idcard_array[ 13 ])) * 5 + (parseInt(idcard_array[ 4 ]) + parseInt(idcard_array[ 14 ])) * 8 + (parseInt(idcard_array[ 5 ]) + parseInt(idcard_array[ 15 ])) * 4 + (parseInt(idcard_array[ 6 ]) + parseInt(idcard_array[ 16 ])) * 2 + parseInt(idcard_array[ 7 ]) * 1 + parseInt(idcard_array[ 8 ]) * 6 + parseInt(idcard_array[ 9 ]) * 3 ; Y = S % 11 ; M = " F " ; JYM = " 10X98765432 " ; M = JYM.substr(Y, 1 ); // 判断校验位 if (M == idcard_array[ 17 ]) return Errors[ 0 ]; // 检测ID的校验位 else return Errors[ 3 ]; } else return Errors[ 2 ]; break ; default : return Errors[ 1 ]; break ; } }