Board logo

標題: 身份證驗證 [打印本頁]

作者: may    時間: 2011-5-29 09:52     標題: 身份證驗證

<?
    // http://home.so-net.net.tw/idealist/Other/SSN.html
    // http://www.southmaster.com/artic ... =red2.php&id=53
    // 驗證 function
    function checkid($id){  // 接收的變數為 id
        $id = strtoupper($id);  // 將英文字母轉換成大寫
        // strtolower()  轉換成小寫
        // 英文字母轉換成兩位數字,加權後相加的值
        $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)];
            //echo $total;
            // 取得檢查號碼
            $point = array_pop($stringArray);
            //echo $point;
            // 計算去頭去尾之後的長度
            $len = count($stringArray);
            //echo $len;
            // 計算加權後的分數
            for($j=0;$j<$len;$j++){
                $total += $stringArray[$j]*$multiply[$j];
                // $a += 5*2 ---> $a = $a+5*2  
            }
            //echo $total;
            // 求餘數
            $last = (($total%10) == 0)?010-($total%10));
            /*
            
            if($total%10 == 0){
                $last = 0;
            }else{
                $last = 10 - ($total%10);
            }
            
            */
            if($last == $point){
                echo "正確";
            }else{
                echo "錯誤";
            }
            
        }
         
         
    }
     
    function getid(){
        // 城市的加權
        $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)));
        // chr() 取得 ascii 對應的大寫字母  A:65 Z:90
        // 取得一組八位數的數組
        $id[1] = rand(1,2);  // 取得性別
        //$id[1] = substr($id,1)%2 + 1;   取得性別
        // 計算加權的總和
        $total = $city[$id[0]];  // 取得城市的加權
        for($i=1;$i<=8;$i++){  // 第 2 - 8 數字的加權總合
            $total += $id[$i] * (9-$i);
        }
        $checkcode;
        if($total%10 == 0){
            $checkcode = 0;
        }else{
            $checkcode = 10 - ($total%10);
        }
        return $id.$checkcode;  // 回傳身分證字號
         
    }
     
     
    echo getid();

?>




歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/) Powered by Discuz! 7.2