简爱博客
身份证号码验证算法 (PHP JavaScript 代码)
2015-7-17 简爱


18 位身份证号码结构



1-2 位省、自治区、直辖市代码

3-4 位地级市、盟、自治州代码

5-6 位县、县级市、区代码

7-14 位出生年月日,比如19670401代表1967年4月1日

15-17 位为顺序号,其中17位 为性别 男为单数,女为双数

18 位为校验码,0-9和X。作为尾号的校验码 (计算方法下面有)

举例:

130503 19070101 0013 这个身份证号的含义: 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001 (1 性别 男),2为校验码。







15 位的身份证相比 18 出生年月 中的 年 为两位, 且缺少 最后一位 校验码



身份证校验码的计算方法



计算最后一位校验码的具体步骤




  1. 17 号码 加权求和 注: 1-17位 加权因子分别为 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2


  2. 上一步所求的和 取模 (下面的 代码 用的是 取余)


  3. 上一步的 结果 0 - 10 分别对应 的 校验码 为 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2







判断身份证号码是否正确的 函数



下面是 判断身份证号码是否正确的 函数封装 分别为 PHP JS



传入 身份证号码 返回校验结果 true false


/* PHP 验证 身份证号 */
function ckeckIdCard($id){
static $codeArr = array(1,0,'X',9,8,7,6,5,4,3,2),
$keyArr = array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
$id = strtoupper($id);
if(!preg_match('/^[\d]{17}[\dX]{1}$/', $id)) return false;

$num = 0;
for($i=0; $i<17; $i++){
$num += $id[$i] * $keyArr[$i];
}
$key = $num % 11;
return substr($id, -1) == $codeArr[$key];
}





/* JS 验证 身份证号 */
function ckeckIdCard($id){
var $codeArr = [1,0,'X',9,8,7,6,5,4,3,2],
$keyArr = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
$id = $id.toUpperCase();
if(!/^[\d]{17}[\dX]{1}$/.test($id)) return false;

$num = 0;
for($i=0; $i<17; $i++){
$num += $id[$i] * $keyArr[$i];
}
$key = $num % 11;
return $id.slice(-1) == $codeArr[$key];
}