身份证号码验证,验证最后一位校验码
身份证号第18位是校验码,可以通过计算准确的验证身份证号是否正确。参考了网上的代码,自己修改了一些,写在这里备忘。
JavaScript代码:
<html> <head> <meta charset="utf8"> <title>身份证校验</title> <style> p { color:red; } </style> </head> <body> 身份证号码:<input id="idCardText" value="52222719790813281x"/><br/> <button onclick="test();">校验</button><br/> <p id="result1">---<p> <p id="result2">---<p> </body> <script> // 测试 function test(){ var idCardText = document.getElementById('idCardText').value; var r1 = isIdCard(idCardText); var r2 = isIdCardStrict(idCardText); document.getElementById('result1').innerHTML = '粗略的验证:'+r1; document.getElementById('result2').innerHTML = '校验码验证:'+r2; } /* * 校验18位身份证,粗略的校验 * * @param idCard * 身份证号 * @return 验证成功返回true,验证失败返回false */ function isIdCard(idCard) { if(!idCard || idCard.length!=18){ return false; } /* * 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 regex = /^(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)(\d{4})(19|20|21)(\d{2})(1[0-2]|0[1-9])(0[1-9]|[1-2][0-9]|3[0-1])(\d{3})(\d{1}|X|x)$/; return regex.test(idCard); } /* * 校验18位身份证,比较严格的校验,对身份证号进行校验码验证 * * @param idCard * 身份证号 * @return 验证成功返回true,验证失败返回false */ function isIdCardStrict(idCard) { if (!isIdCard(idCard)) { // 先进行粗略校验 return false; } /* 粗略校验通过后,必定有18位字符,对身份证的最后一位校验码进行验证 */ var prefix = new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); // 加权因子数组 var suffix = new Array( "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" ); // 校验码数组,其中X为10 var wiSum = 0; // 用来保存前17位各自乖以加权因子后的总和 for (var i = 0; i < 17; i++) { wiSum += parseInt(idCard[i]) * prefix[i]; } var wiMod = wiSum % 11; // 计算出校验码所在数组的位置 var code = suffix[wiMod]; // 从数组中得到校验码,如果wiMod等于2,则说明校验码是10,身份证号码最后一位应该是X var idCardLast = idCard[17].toUpperCase(); // 获取身份证号码的最后一位,最后一位是校验码 // 用计算出来的校验码与最后一位身份证号码比较,如果相等,说明验证通过,否则是无效的身份证号码 return (code==idCardLast); } </script> </html>
Java代码:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class ValidationUtil { /** * 使用正则表达式验证 * * @author WuQianLing * @param regex * 正则表达式 * @param content * 需要验证的内容 * @return 验证通过返回true,验证失败返回false */ public static boolean isMatch(String regex, String content) { if (regex == null || content == null || content.isEmpty()) { // 当为空时直接返回false return false; } Pattern p = Pattern.compile(regex); Matcher m = p.matcher(content); return m.matches(); } /** * 校验18位身份证,粗略的校验 * * @author WuQianLing * @param idCard * 身份证号 * @return 验证成功返回true,验证失败返回false */ public static boolean isIdCard(String idCard) { /* * 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国外) */ // 粗略的校验 String regex = "^(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)(\\d{4})(19|20|21)(\\d{2})(1[0-2]|0[1-9])(0[1-9]|[1-2][0-9]|3[0-1])(\\d{3})(\\d{1}|X|x)$"; return isMatch(regex, idCard); } /** * 校验18位身份证,比较严格的校验,对身份证号进行校验码验证 * * @author WuQianLing * @param idCard * 身份证号 * @return 验证成功返回true,验证失败返回false */ public static boolean isIdCardStrict(String idCard) { if (!isIdCard(idCard)) { // 先进行粗略校验 return false; } /* 粗略校验通过后,必定有18位字符,对身份证的最后一位校验码进行验证 */ int[] prefix = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; // 加权因子数组 String[] suffix = new String[] { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }; // 校验码数组,其中X为10 int wiSum = 0; // 用来保存前17位各自乖以加权因子后的总和 for (int i = 0; i < 17; i++) { wiSum += Integer.valueOf(idCard.charAt(i) + "") * prefix[i]; } int wiMod = wiSum % 11; // 计算出校验码所在数组的位置 String code = suffix[wiMod]; // 从数组中得到校验码,如果wiMod等于2,则说明校验码是10,身份证号码最后一位应该是X String idCardLast = idCard.substring(17); // 获取身份证号码的最后一位,最后一位是校验码 // 用计算出来的校验码与最后一位身份证号码比较,如果相等,说明验证通过,否则是无效的身份证号码 return code.equalsIgnoreCase(idCardLast); } /** * 测试 * * @author WuQianLing * @param args */ public static void main(String[] args) { String idCard = "52222719790813281x"; System.out.println("粗略校验:idCard=" + idCard + " " + isIdCard(idCard)); System.out.println("严格校验:idCard=" + idCard + " " + isIdCardStrict(idCard)); idCard = "522227197908132812"; System.out.println("粗略校验:idCard=" + idCard + " " + isIdCard(idCard)); System.out.println("严格校验:idCard=" + idCard + " " + isIdCardStrict(idCard)); } }
测试结果: