[精讚] [會員登入]
2342

[PHP] 台灣身分證號及檢查程式

台灣身分證號及PHP檢查程式

此文完整連結 http://n.sfs.tw/10563

複製連結 [PHP] 台灣身分證號及檢查程式@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2017-01-12 20:55:19 最後編修
2017-01-06 15:22:24 By 瘦河馬
 

台灣地區身分證字號編碼規則

共有十個字元,第1個字元是大寫英文字母,由初次登記的戶籍地決定[2]

第2個字元是數字或大寫英文A-D,分別代表的意義如下[3]

  臺灣地區有戶籍國民:男性為1、女性為2 

  臺灣地區無戶籍國民、大陸地區人民、港澳居民:男性使用A、女性使用B(入出境管理局使用)

  外國人:男性使用C、女性使用D(警察局外事科/課使用)

第3~9個字元是數字,共有7位數,有10,000,000組

第3碼依內政部92年4月24日台內戶字第0920063929號函規定[5],自92年7月開始,有關在台無戶籍之外籍、港澳、大陸地區人民及無戶籍國民申請定居時,另行配賦國民身分證統一編號,並以第三碼「6、7、8、9」為區別碼,其區別標準如下:

  1、載有「取得國籍日期」者,配賦代碼「6」。
  2、載有「海外僑民」者,配賦代碼「7」。
  3、載有「港澳居民」者,配賦代碼「8」。
  4、載有「大陸地區人民」者,配賦代碼「9」。

無論如何都是數字

第10個字元是數字,檢查碼

  檢查碼的演算似乎沒有官方的說明文件,但可參考維基百科上的演算方法;若第二碼非數字者,可參考[4]的說明

PHP的檢查程式

為此我撰寫了一個PHP的檢測身分證字號的程式,他能檢驗是否能符合以上所有規則,回傳真假。相較於其他人寫的程式,我在程式碼上做了優化,並測試了一千萬筆的資料,發現程式速度非常的快,代價就是不易讀。

/** 函數名稱:boolean check_pid(string)
* 功能:身分證字號檢查
* 語法:check_pid(身分證字串)
* 回傳:符合規則成功回傳true, 否則回傳false
**/

function chk_pid($id) {
    if( !$id )return false;
    $id = strtoupper(trim($id)); //將英文字母全部轉成大寫,消除前後空白
    //檢查第一個字母是否為英文字,第二個字元1 2 A~D 其餘為數字共十碼
    $ereg_pattern= "^[A-Z]{1}[12ABCD]{1}[[:digit:]]{8}$";
    if(!ereg($ereg_pattern, $id))return false;
    $wd_str="BAKJHGFEDCNMLVUTSRQPZWYX0000OI";   //關鍵在這行字串
    $d1=strpos($wd_str, $id[0])%10;
    $sum=0;
    if($id[1]>='A')$id[1]=chr($id[1])-65; //第2碼非數字轉換依[4]說明處理
    for($ii=1;$ii<9;$ii++)
        $sum+= (int)$id[$ii]*(9-$ii);
    $sum += $d1 + (int)$id[9];
    if($sum%10 != 0)return false;
    return true;
}
 

參考資料

[1] Javascript 的身分證字號檢查程式 http://squall75726.pixnet.net/blog/post/309981516#comment-42707747

[2] 維基百科上身分證 https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%9C%8B%E6%B0%91%E8%BA%AB%E5%88%86%E8%AD%89

[3] 內政部外來人口統一證號編碼原則 https://www.immigration.gov.tw/ct_cert.asp?xItem=1106801&ctNode=32601

[4 外國人身分證字號驗證 http://gomumu.pixnet.net/blog/post/3128951-%5B%E7%9F%A5%E8%AD%98%2B%5D%E5%A4%96%E7%B1%8D%E4%BA%BA%E5%A3%AB%E7%94%A8%E7%9A%84%E7%B5%B1%E4%B8%80%E8%AD%89%E8%99%9F%E7%B7%A8%E7%A2%BC%E8%A6%8F%E5%89%87

[5] http://mlhr.miaoli.gov.tw/law.php?page=21&kind=24


 

你可能感興趣的文章

[phpmyadmin] 缺少 mcrypt 外掛,請檢查 PHP 設定 缺少 mcrypt 外掛,請檢查 PHP 設定,安裝php-mcrypt。

[PHP] 將UTF8中文字轉成10進位或16進位數值 原本為了處理 preg_match 中文字的問題[2],用php把中文字轉換成10進位和6進位的數值編碼

使用Yahoo OAuth2 1/2 使用Yahoo OAuth2來認證我的網站

[PHP] 類別中要怎麼使用callback function 召回函數(回呼函數)? 在類別中使用標準函數,若其中的callback 函數也是在類別中,該怎麼使用?

[PHP] 隨機產生一個顏色字串 讓PHP 隨機產生一個顏色字串

[PHP] 判斷文字、數字、文字加數字的方法 幾個PHP數字和文字操作上的小眉角:判斷文字、數字、文字加數字的方法

[PHP] 使用browscap檢查瀏覽器版本 使用PHP內建函數browscap檢查瀏覽器版本

[PHP] 陣列排序 sort, ksort, asort, usort... 簡單的記錄PHP的陣列排序,因為常常會用到。

PHP cli 傳入參數 php cli (PHP命令列的傳入參數使用方法

[PHP] CodeIgniter 3+pure+smarty安裝及環境設置2/2 PHP framework CodeIgniter 3+ pure CSS +smarty Template Engine的整合#2

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[MAC] 截取螢幕畫面的方法 截取螢幕畫面的方法,在MAC中叫作螢幕快照,英文是screenshot

UTF-8 BOM (Byte Order Mark) 的問題 在 Michael Kaplan 那看到 Every character has a story #4: U+feff

為什麼要重造輪子? 什麼輪子?造什麼輪子?我為什麼要重造輪子?

[bc] linux 的計算機 bc 設定小數位數、計算π、次方根 linux 的計算機 bc 設定小數位數、計算π、次方根

UTF-8的網頁但IE8一片空白 UTF8編碼的網頁在Firefox 正常顯示、但IE8 就是空白,IE8編碼設定是「自動偵測」可是自動偵測到的是 big5...