[精讚] [會員登入]
21311

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

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

分享此文連結 //n.sfs.tw/10563

分享連結 [PHP] 台灣身分證號及檢查程式@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2021-07-10 13:36:51 最後編修
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]=ord($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


 

END

你可能感興趣的文章

[PHP+ci4] codeignitor4+ smarty5 這篇整合 php 的framework codeignitor4 + smarty5。

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

[CodeIgniter 3] COOKIE的使用 PHP CodeIgniter 3 中COOKIE的使用超簡單

[PHP] 類別的繼承及建構子和解構子 PHP 類別的繼承及建構子和解構子

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

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

我有話要說

>>

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

訪客留言

Jun
關於 function chk_pid() chr應該改為ord才正確,chr應該是把ascii chr 是將輸入 ASCII code編碼 (int),回傳對應的ASCII code字元 @2021-07-09 14:48:37

新精讚
耶,對。因為都沒有遇到那麼特殊的身分證,所以都沒有發現錯誤。大感謝,程式範例第16行改成ord。
2021-07-10 13:36:18

隨機好文

[jQuery] textarea 的取值和給值 HTML 的 TEXTAREA 標籤若要用 jquery 取值,不能使用 .text() 或 .html() ,使用 .

沒有非誰做不可的事,也沒有不可被取代的人 沒有非誰做不可的事,也沒有不可被取代的人

[jQuery] select 元件的取值及給值 html中的元件select,在jquery中要如何使用?

看懂DSUB DVI HDMI USB等各式影音接頭 看懂DSUB DVI HDMI等各式影音接頭

[JAVA] JWS, JWT, JWE, JOSE是什麼? [JAVA] JWS, JWT, JWE, JOSE是什麼?非常的複雜,儘量來搞清楚..