最近需要寫到身份證字號驗證,參考相關網站介紹的規則,所試著也以PHP來寫看看這個函式。
-- Frank 補充
-- 經驗證 ,檢查的身份證字號會判斷為 Fail ,故修正函式 .
-- 如以下紅字部份 ,謝謝
//**************
// 身份證檢查
//**************
function checkNick($id){
//建立字母分數陣列
$head = array('A'=>1,'I'=>39,'O'=>48,'B'=>10,'C'=>19,'D'=>28, 'E'=>37,'F'=>46,'G'=>55,
'H'=>64,'J'=>73,'K'=>82, 'L'=>2,'M'=>11,'N'=>20,'P'=>29,'Q'=>38,'R'=>47,
'S'=>56,'T'=>65,'U'=>74,'V'=>83,'W'=>21,'X'=>3, 'Y'=>12,'Z'=>30);
//建立加權基數陣列
$multiply = array(8,7,6,5,4,3,2,1);
//檢查身份字格式是否正確
if (ereg("^[a-zA-Z][1-2][0-9]+$",$id) && strlen($id) == 10){
//切開字串
$len = strlen($id);
for($i=0; $i<$len; $i++)
{
$stringArray[$i] = substr($id,$i,1);
}
//取得字母分數
$total = $head[array_shift($stringArray)];
// 原本為 headPoint by Frank
//取得比對碼
$point = array_pop($stringArray);
//取得數字分數
$len = count($stringArray); // 遺漏分號
for($j=0; $j<$len; $j++){
$total += $stringArray[$j]*$multiply[$j];
}
//檢查比對碼
if (($total%10 == 0 )?0:10-$total%10 != $point) {
return false;
} else {
return true;
}
} else {
return false;
}
}
//***************
// 身份證產生
//***************
function getRandID(){
//建立字母分數陣列
$headPoint = array('A'=>1,'I'=>39,'O'=>48,'B'=>10,'C'=>19,'D'=>28,
'E'=>37,'F'=>46,'G'=>55,'H'=>64,'J'=>73,'K'=>82,
'L'=>2,'M'=>11,'N'=>20,'P'=>29,'Q'=>38,'R'=>47,
'S'=>56,'T'=>65,'U'=>74,'V'=>83,'W'=>21,'X'=>3,
'Y'=>12,'Z'=>30);
//建立加權基數陣列
$multiply = array(8,7,6,5,4,3,2,1);
//取得隨機數字
$number = mt_rand(1,2);
for($i=0 ;$i<7 ;$i++){
$number .= mt_rand(0,9);
}
//切開字串
$len = strlen($number);
for($i=0;$i<$len;$i++){
$stringArray[$i] = substr($number,$i,1);
}
//取得隨機字母分數
$index = chr(mt_rand(65,90));
$total = $headPoint[$index];
//取得數字分數
$len = count($stringArray);
for($j=0; $j<$len; $j++){
$total += $stringArray[$j]*$multiply[$j];
}
//取得檢查比對碼
if ($total%10 == 0 ) {
return $index . $number . 0;
} else {
return $index.$number.(10 - $total % 10);
}
}
原文轉貼自 : http://liaosankai.pixnet.net/blog/post/14514213