校验身份证

PHP

class Validator
{
    /**
     * 验证身份证格式
     *
     * @access   public
     * @param    string         $idcard    身份证
     *
     * @return   bool
     */
    public function checkIDCard($idcard)
    {
        if(strlen($idcard) == 15 || strlen($idcard) == 18)
        {
            if(strlen($idcard) == 15)
            {
                $idcard = $this->_idcard_15to18($idcard);
            }
 
            if($this->_idcardChecksum18($idcard))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
 
    /**
     * 检测身份证
     *
     * @return   string
     */
    private function _idcardVerifyNumber($idcard_base)
    { 
        if (strlen($idcard_base) != 17)
        { 
            return false;
        }
 
        // 加权因子
        $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
 
        // 校验码对应值
        $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
 
        $checksum = 0;
        for ($i = 0; $i < strlen($idcard_base); $i++)
        {
            $checksum += substr($idcard_base, $i, 1) * $factor[$i];
        }
 
        $mod = $checksum % 11;
        $verify_number = $verify_number_list[$mod];
 
        return $verify_number;
    }
 
    /**
     * 将15位身份证升级到18位
     * $idcard: 身份证号
     *
     * @return   mixed
     */
    private function _idcard_15to18($idcard)
    {
        if (strlen($idcard) != 15)
        { 
            return false;
        }
        else
        {
            // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码 
            if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false)
            {
                $idcard = substr($idcard, 0, 6) . '18'. substr($idcard, 6, 9);
            }
            else
            {
                $idcard = substr($idcard, 0, 6) . '19'. substr($idcard, 6, 9);
            }
        }
 
        $idcard = $idcard . $this->_idcardVerifyNumber($idcard);
 
        return $idcard;
    }
 
    /**
     * 18位身份证校验码有效性检查
     * $idcard: 身份证号
     *
     * @return   bool
     */
    private function _idcardChecksum18($idcard)
    { 
        if (strlen($idcard) != 18)
        {
            return false;
        }
        $idcard_base = substr($idcard, 0, 17);
 
        if ($this->_idcardVerifyNumber($idcard_base) != strtoupper(substr($idcard, 17, 1)))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

Javascript

function checkIdcard(idcard){
    //return false;
    var Errors=new Array("验证通过!","身份证号码位数不对!","身份证号码出生日期超出范围或含有非法字符!","身份证号码校验错误!","身份证地区非法!");
    var area={
        11:"北京",
        12:"天津",
        13:"河北",
        14:"山西",
        15:"内蒙古",
        21:"辽宁",
        22:"吉林",
        23:"黑龙江",
        31:"上海",
        32:"江苏",
        33:"浙江",
        34:"安徽",
        35:"福建",
        36:"江西",
        37:"山东",
        41:"河南",
        42:"湖北",
        43:"湖南",
        44:"广东",
        45:"广西",
        46:"海南",
        50:"重庆",
        51:"四川",
        52:"贵州",
        53:"云南",
        54:"西藏",
        61:"陕西",
        62:"甘肃",
        63:"青海",
        64:"宁夏",
        65:"新疆",
        71:"台湾",
        81:"香港",
        82:"澳门",
        91:"国外"
    }
    var idcard,Y,JYM;
    var S,M;
    var idcard_array = new Array();
    idcard_array = idcard.split("");
    if(area[parseInt(idcard.substr(0,2))]==null) return false;//return Errors[4];
    switch(idcard.length){
        case 15:
            if ((parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
                ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
            }
            else{
                ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
            }
            if(ereg.test(idcard))
                return true;
            else
                return false
            break;
        case 18:
            if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
                ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
            }
            else{
                ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
            }
            if(ereg.test(idcard)){
                S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
                  + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
                  + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
                  + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
                  + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
                  + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
                  + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 
                  + parseInt(idcard_array[7]) * 1 + parseInt(idcard_array[8]) * 6
                  + parseInt(idcard_array[9]) * 3 ;
                Y = S % 11;
                M = "F";
                JYM = "10X98765432";
                M = JYM.substr(Y,1);
                if(M == idcard_array[17])
                    //return Errors[0];
                    return true;
                else
                    //return Errors[3];
                    return false;
            }
            else
                //return Errors[2];
                return false;
            break;
        default:
            //return Errors[1];
            return false;
            break;
    }
}
snippets/checkidcard.txt · 最后更改: 2010/03/31 06:31 (外部编辑)
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki