PHP校验身份证号是否正确
用PHP语言实现校验身份证号的算法,供参考
/*** 校验身份证号是否正确* @param $idcard 身份证号* @return bool true正确*/public static function validateIDCard($idcard) {if(empty($idcard)){return false;}if (!preg_match('/(^\d{15}$)|(^\d{17}([0-9]|X|x)$)/',$idcard)){return false;}$idcard = strtoupper($idcard); # 如果是小写x,转化为大写Xif(strlen($idcard) != 18 && strlen($idcard) != 15){return false;}# 如果是15位身份证,则转化为18位if(strlen($idcard) == 15){# 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false) {$idcard = substr($idcard, 0, 6) . '18' . substr($idcard, 6, 9);} else {$idcard = substr($idcard, 0, 6) . '19' . substr($idcard, 6, 9);}# 加权因子$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);# 校验码对应值$code = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');$checksum = 0;for ($i = 0; $i < strlen($idcard); $i++) {$checksum += substr($idcard, $i, 1) * $factor[$i];}$idcard = $idcard . $code[$checksum % 11];}# 验证身份证开始$IDCardBody = substr($idcard, 0, 17); # 身份证主体$IDCardCode = strtoupper(substr($idcard, 17, 1)); # 身份证最后一位的验证码# 加权因子$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);# 校验码对应值$code = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');$checksum = 0;for ($i = 0; $i < strlen($IDCardBody); $i++) {$checksum += substr($IDCardBody, $i, 1) * $factor[$i];}$validateIdcard = $code[$checksum % 11]; # 判断身份证是否合理return $validateIdcard == $IDCardCode;}