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

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

function checkTwID($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 (preg_match("^[a-zA-Z][1-2][0-9]+$",$id) AND strlen($id) == 10){
		//切開字串
		$stringArray = str_split($id);
		//取得字母分數(取頭)
		$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;$i<=8;$i++){
        $total += $id[$i] * (9 - $i);
    }
    //補上最後檢查碼
    return $id.substr((10-substr($total, -1)),-1);
}
arrow
arrow
    全站熱搜

    低溫烘培 發表在 痞客邦 留言(1) 人氣()