LEN

PHP 身份证号码验证方法
公民身份证号码按照 GB11643—1999《公民身份证号码》国家标准编制,由18位数字组成:前6位为行政区划分代...
扫描右侧二维码阅读全文
19
2019/02

PHP 身份证号码验证方法

公民身份证号码按照 GB11643—1999《公民身份证号码》国家标准编制,由18位数字组成:前6位为行政区划分代码,第7位至14位为出生日期码,第15位至17位为顺序码,第18位为校验码。算法结构为:前六位表示所在地,7~14位为出生年月日,倒数第二位为性别,最后一位为较验码

<?php

//验证身份证
function checkCard($idcard)
{
    if (strlen($idcard) == 15) {
        //若身份证顺序码是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 . idcard_verify_number($idcard);
    }
    if (strlen($idcard) != 18) {
        return false;
    }
    $idcard_base = substr($idcard, 0, 17);
    if (idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))) {
        return false;
    }

    return true;
}

function idcard_verify_number($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;
}
最后修改:2019 年 02 月 22 日 09 : 34 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论