看板 Mesak
作者 標題 [PHP] 身份證字號驗證 精簡版
時間 2012年11月30日 Fri. PM 01:10:03
部落格:
http://mesak.tw/?p=628
一般版本:
http://disp.cc/b/732-4HbV
function pid_check($pid)
{
}
{
$iPidLen = strlen($pid);
if(!preg_match("/^[A-Za-z][1-2][0-9]{8}$/",$pid) && $iPidLen != 10)
{
return FALSE;
}
$head = array("A"=>1,"B"=>10,"C"=>19,"D"=>28,"E"=>37,"F"=>46,"G"=>55,"H"=>64,"I"=>39,"J"=>73,"K"=>82,"M"=>11,"N"=>20,"O"=>48,"P"=>29,"Q"=>38,"T"=>65,"U"=>74,"V"=>83,"W"=>21,"X"=>3,"Z"=>30,"L"=>2,"R"=>47,"S"=>56,"Y"=>12);
$pid = strtoupper($pid);
$iSum = 0;
for($i=0;$i<$iPidLen;$i++)
{
$sIndex = substr($pid,$i,1);
$iSum += (empty($i)) ? $head[$sIndex ] : intval($sIndex) * abs( 9 - base_convert($i,10,9) );
}
return ( $iSum % 10 == 0 ) ? TRUE:FALSE;
}
省去第一二位 英文直接換算總數
Name | Value | 算式 | Total |
---|---|---|---|
A | 10 | 1 * 1 + 0 * 9 | 1 |
B | 11 | 1 * 1 + 1 * 9 | 10 |
C | 12 | 1 * 1 + 2 * 9 | 19 |
D | 13 | 1 * 1 + 3 * 9 | 28 |
E | 14 | 1 * 1 + 4 * 9 | 37 |
F | 15 | 1 * 1 + 5 * 9 | 46 |
G | 16 | 1 * 1 + 6 * 9 | 55 |
H | 17 | 1 * 1 + 7 * 9 | 64 |
I | 34 | 3 * 1 + 4 * 9 | 39 |
J | 18 | 1 * 1 + 8 * 9 | 73 |
K | 19 | 1 * 1 + 9 * 9 | 82 |
M | 21 | 2 * 1 + 1 * 9 | 11 |
N | 22 | 2 * 1 + 2 * 9 | 20 |
O | 35 | 3 * 1 + 5 * 9 | 48 |
P | 23 | 2 * 1 + 3 * 9 | 29 |
Q | 24 | 2 * 1 + 4 * 9 | 38 |
T | 27 | 2 * 1 + 7 * 9 | 65 |
U | 28 | 2 * 1 + 8 * 9 | 74 |
V | 29 | 2 * 1 + 9 * 9 | 83 |
W | 32 | 3 * 1 + 2 * 9 | 21 |
X | 30 | 3 * 1 + 0 * 9 | 3 |
Z | 33 | 3 * 1 + 3 * 9 | 30 |
L | 20 | 2 * 1 + 0 * 9 | 2 |
R | 25 | 2 * 1 + 5 * 9 | 47 |
S | 26 | 2 * 1 + 6 * 9 | 56 |
Y | 31 | 3 * 1 + 1 * 9 | 12 |
其實也可以不用用進位法表示
$point = (9-$i == 0) ? 9-$i : 1;
或是$point = 9-$i;
if($point == 0){$point++;}
if($point == 0){$point++;}
intval($sIndex) * $point;
也是一種辦法,不過我覺得二進位表示比較好玩 XD
對照表也可以留下餘數,更省
--
※ 作者: mesak 時間: 2012-11-30 13:10:03
※ 編輯: mesak 時間: 2014-02-04 17:57:41
※ 看板: Mesak 文章推薦值: 0 目前人氣: 0 累積人氣: 547
回列表(←)
分享