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]Y = S mod 11Y: 0 1 2 3 4 5 6 7 8 9 10 → 校驗碼: 1 0 X 9 8 7 6 5 4 3 2<?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 年等明顯錯誤。/^\d{17}[\dX]$/i 先過濾格式明顯錯誤。| 錯誤 | 原因 | 修正 |
|---|---|---|
| 校驗碼 X 大小寫 | 比對未統一大小寫 | strtoupper() 統一 |
| 加權因子順序錯誤 | 陣列索引對應位置反向 | 嚴格按標準順序定義陣列 |
| 字串索引取數字 | $base[$i] 返回字串需 (int) 轉型 | 明確轉型或 intval() |
身份證校驗演算法標準化、實作簡單,核心在於正確的加權因子與查表映射。結合地址碼、出生日期、年齡等業務規則,可構建高可靠的實名驗證閘道。