程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> PHP中驗證身份證號碼的函數

PHP中驗證身份證號碼的函數

編輯:PHP基礎知識
 

在驗證身份證號碼之前,我們先來說一說身份證號碼的涵義。我們的身份證號目前為18位,但在 1999年以前是15位的號碼,多出來的這三位是什麼意義呢?18位號碼由原2位表示年份的改為4位,再由後面加一個校驗碼,就這樣多出了三位數。
  在這15位或18位號碼中,前6位是表示地點的。接下來6位數(15位的號碼)或8位數(18位的號碼)是表示出生年月日的。然後就是三位順序碼,然而在18位的身份證號中,還有一位。那就是校驗碼,由0-9和X組成,這一位數字是根據前17位號碼計算而得到的。所以,有些時候我們在網上隨便輸入一個18位的身份證號時出現身份證號錯誤的情況,原因就是校驗碼不對。

  如何可以檢查身份證號是否有效呢,請看下面本人寫的一個函數,可以校驗18位的身份證號碼。函數代碼如下:

/**
* 檢查身份證號碼
* 參數:15位或18位身份證號碼,可選參數 $len 可以15位號碼。
* 返回值:失敗返回FALSE,成功返回一個18位的身份證號
*/
function checkID ($sfznum,$len='both') {
if (strlen($sfznum)==15 && $len=='both') { //當$len不等於'both'時,15位號碼無效
$truenum=substr($sfznum,0,6).'19'.substr($sfznum,6); //為返回18位號碼作准備。
$preg="/^[\d]{8}((0[1-9])|(1[0-2]))((0[1-9])|([12][\d])|(3[01]))[\d]{3}$/";
} elseif (strlen($sfznum)==18) {
$truenum=substr($sfznum,0,17);
$preg="/^[\d]{6}((19[\d]{2})|(200[0-8]))((0[1-9])|(1[0-2]))((0[1-9])|([12][\d])|(3[01]))[\d]{3}[0-9xX]$/";
} else {
return false;
}
if (!preg_match($preg,$sfznum)) return false; //完成正則表達式檢測

/*----------- 以下計算第18位驗證碼-------------*/
$nsum = substr($truenum, 0,1)*7;
$nsum = $nsum + substr($truenum, 1,1)*9;
$nsum = $nsum + substr($truenum, 2,1)*10;
$nsum = $nsum + substr($truenum, 3,1)*5;
$nsum = $nsum + substr($truenum, 4,1)*8;
$nsum = $nsum + substr($truenum, 5,1)*4;
$nsum = $nsum + substr($truenum, 6,1)*2;
$nsum = $nsum + substr($truenum, 7,1)*1;
$nsum = $nsum + substr($truenum, 8,1)*6;
$nsum = $nsum + substr($truenum, 9,1)*3;
$nsum = $nsum + substr($truenum,10,1)*7;
$nsum = $nsum + substr($truenum,11,1)*9;
$nsum = $nsum + substr($truenum,12,1)*10;
$nsum = $nsum + substr($truenum,13,1)*5;
$nsum = $nsum + substr($truenum,14,1)*8;
$nsum = $nsum + substr($truenum,15,1)*4;
$nsum = $nsum + substr($truenum,16,1)*2;
$yzm = 12 - $nsum % 11;
if($yzm==10)$yzm='x';
elseif($yzm==12)$yzm='1';
elseif($yzm==11)$yzm='0';
/*----------18位驗證碼計算完成-------------*/
if (strlen($sfznum)==18) {
if (substr($sfznum,17,1)!=$yzm) return false;
}
return $truenum.$yzm;
}

備注:用過了。還不錯的。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved