天天看點

php 驗證身份證号碼

身份證号碼的結構

身份證号碼是特征組合碼,由17位數字本體碼和一位校驗碼組成。

排列順序從左至右依此為:六位數字位址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。

位址碼(前六位數)

表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼,按GB/T2260的規定運作。

出生日期碼(第七位至十四位)

表示編碼對象出生的年、月、日,按GB/T7408的規定運作。年、月、日代碼之間不用分隔符。

順序碼(第十五位至十七位)

表示在同一位址碼所辨別的區域範圍,對同年、同月、同日出生的人編定的順序号,順序碼奇數配置設定給男性。偶數配置設定給女性。

校驗碼(第十八位數)

1.十七位數字本體碼權重求和公式

S= SUM(Ai * Wi), i=0, ... , 16, 先對前17位數字的權求和。

Ai:表示第i位置上的身份證号碼數字值

Wi:表示第i位置上的權重因子

Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

2. 計算模

Y = mod(S, 11)

3.通過模得到相應的校驗碼

Y: 0 1 2 3 4 5 6 7 8 9 10

校驗碼: 1 0 X 9 8 7 6 5 4 3 2 

驗證身份證号碼方法:

php

function checkIdCard($idcard){

// 僅僅能是18位

if(strlen($idcard)!=18){

return false;

}

// 取出本體碼

$idcard_base = substr($idcard, 0, 17);

// 取出校驗碼

$verify_code = substr($idcard, 17, 1);

// 權重因子

$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

// 校驗碼相應值

$verify_code_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

// 依據前17位計算校驗碼

$total = 0;

for($i=0; $i<17; $i++){

$total += substr($idcard_base, $i, 1)*$factor[$i];

// 取模

$mod = $total % 11;

// 比較校驗碼

if($verify_code == $verify_code_list[$mod]){

return true;

}else{

$idcard = '這裡填寫要驗證的身份證号碼';

var_dump(checkIdCard($idcard));

?

>