[精讚] [會員登入]
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

你可能感興趣的文章

設定Google analytics API #3 -- 查詢範例 讓你的網站能夠存取你的Google analytics上面的資料

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

[PHP7] 讀取mysql資料庫的傳統方法 使用傳統預設的方法來連結mysql資料庫

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

[PHP] 解析二進位圖片 使用php來解析png圖片,把資料寫在16進位格式

[CodeIgniter 3] 資料庫的使用方法整理2/2 CI3 承襲 CI2,有很多的builder class可以用,依各人的使用習慣,有人喜歡一堆sql字串,有人喜歡用helper

我有話要說

>>

限制:留言最高字數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

隨機好文

[Freebsd] 定時測試 ADSL 是否斷線並重連 中華電信 ADSL 雖有固定 ip,可是他卻會不定時「斷線」, 使用以下的 方法可以定時測試是否斷線,以及重新撥接。

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

APACHE的記錄檔格式 LogFormat 語法 在APACHE中有定義一些記錄的語法模版 在 /etc/httpd/conf/httpd.conf 中: LogForm

正則表達式:Email名稱防止連續輸入點(.)及下底線(_) Email的名稱中要允許特殊符號,但又不允許連續出現的正則表達式

「許功蓋」的字以及源由 有玩過電腦一段時間的人,都聽過這個人(有一天我才發現7年級的竟然都不認識這個