身份證驗證程式 for PHP (精簡版)

後來發現有BUG,所以我修正了一下【於2009-04-15】

沒想到我的舊文章身份證驗證程式 for PHP人氣竟然是最高的,後來用了google大仙查了之後,發現有更精簡的寫法,所以就花了一點時間修改之前寫的方法,XD如果有需要的人就用精簡版吧,如果程式碼有看不懂的留個回應我再做補充吧!繼續閱讀後面也包含了產生器

function userunicode($id){
	$id = strtoupper($id);
	//建立字母分數陣列
	$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);
	//檢查身份字格式是否正確
	if (ereg("^[a-zA-Z][1-2][0-9]+$",$id) AND strlen($id) == 10){
		//切開字串
		$len = strlen($id);
		for($i=0; $i<$len; $i++){
			$stringArray[$i] = substr($id,$i,1);
		}
		//取得字母分數
		$total = $headPoint[array_shift($stringArray)];
		//取得比對碼
		$point = array_pop($stringArray);
		//取得數字分數
		$len = count($stringArray);
		for($j=0; $j<$len; $j++){
			$total += $stringArray[$j]*$multiply[$j];
		}
		//計算餘數碼並比對
		$last = (($total%10) == 0 )?0:(10-($total%10));
		if ($last != $point) {
			return false;
		} else {
			return true;
		}
	}  else {
	   return false;
	}
}


//**********************
// 台灣身份證產生簡短版
//**********************
function getTwID(){
    //建立字母分數陣列
    $city = 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);
    //建立隨機身份證碼
    $id = chr(mt_rand(65,90)).array_pop(explode('.',uniqid(rand(),true)));
    $id[1] = substr($id,1) % 2 + 1;
    //計算總分
    $total = $city[$id[0]];
    for($i=1;$>=8;$i++){
        $total += $id[$i] * (9 - $i);
    }
    //補上最後檢查碼
    return $id.substr((10-substr($total, -1)),-1);
}
五月 28, 2008 • Posted in: PHP, 程式語言

2 Responses to “身份證驗證程式 for PHP (精簡版)”

  1. 身份證驗證程式 for Javascript (精簡版) | ::SANKAI:: - 十月 5, 2008

    [...] 之前那篇「身份證驗證程式 for PHP (精簡版)」最近有空所以把他改寫Javascript版了,最近Ajax技術很盛行,應該會用到,有需要的網友就引用過去吧! [...]

  2. alex - 七月 1, 2010

    身分證產生器第17行,請將$改為$i
    小錯誤

    感謝您的分享

回應(Leave a Reply)