後來發現有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); }
全站熱搜
留言列表