首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 驗證身份證號碼 (18 位) 完整演算法實作

     編輯:PHP 綜合知識

身份證號碼結構 (GB 11643-1999)

  • 1-6 位:地址碼 (縣/市/區行政區劃)
  • 7-14 位:出生日期 (YYYYMMDD)
  • 15-17 位:順序碼 (奇數男、偶數女)
  • 18 位:校驗碼 (0-9 或 X)

校驗碼演算法 (ISO 7064:1983.MOD 11-2)

  1. 加權求和:S = Σ(Ai × Wi), i=0..16
    • Ai:第 i 位數字值
    • Wi:加權因子 [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
  2. 取模:Y = S mod 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 實作

<?php
function checkIdCard($idcard) {
    // 1. 長度檢查
    if (strlen($idcard) !== 18) return false;

    // 2. 前 17 位必須為數字
    if (!ctype_digit(substr($idcard, 0, 17))) return false;

    $base = substr($idcard, 0, 17);
    $verify = strtoupper(substr($idcard, 17, 1));

    $factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
    $verifyMap = ['1','0','X','9','8','7','6','5','4','3','2'];

    $sum = 0;
    for ($i = 0; $i < 17; $i++) {
        $sum += (int)$base[$i] * $factor[$i];
    }

    $mod = $sum % 11;
    return $verify === $verifyMap[$mod];
}

// 測試
$idcard = '11010519900307893X'; // 範例
var_dump(checkIdCard($idcard)); // true/false

進階驗證建議

  • 地址碼有效性:對照最新行政區劃代碼表 (民政部發布)。
  • 出生日期合法性:checkdate($month, $day, $year) 驗證真實日期,排除 2099 年等明顯錯誤。
  • 年齡合理性:根據業務限制 (如 18-100 歲)。
  • 正則快速預檢:/^\d{17}[\dX]$/i 先過濾格式明顯錯誤。

常見錯誤與修正

錯誤原因修正
校驗碼 X 大小寫比對未統一大小寫strtoupper() 統一
加權因子順序錯誤陣列索引對應位置反向嚴格按標準順序定義陣列
字串索引取數字$base[$i] 返回字串需 (int) 轉型明確轉型或 intval()

結語

身份證校驗演算法標準化、實作簡單,核心在於正確的加權因子與查表映射。結合地址碼、出生日期、年齡等業務規則,可構建高可靠的實名驗證閘道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved