PHP中一些常用证件的验证方法

时间:2022-07-23
本文章向大家介绍PHP中一些常用证件的验证方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
<?php

/**
 * 来往港澳通行证:
 * 1.W,C+8位数字
 * 2.7位数字
 */
function gapassport_verify($content)
{
    $pattern = "/^d{7}$|^[W|C]d{8}$/";
    if (!preg_match($pattern, $content)) {
        return false;
    }
    return true;
}

/**
 * 身份证校验代码
 */
function idCardVerify($id_card)
{
    if (strlen($id_card) == 18) {
        return idcard_checksum18($id_card);
    } elseif ((strlen($id_card) == 15)) {
        $id_card = idcard_15to18($id_card);
        return idcard_checksum18($id_card);
    } else {
        return false;
    }
}

// 计算身份证校验码,根据国家标准GB 11643-1999
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;
}

// 将15位身份证升级到18位
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 . idcard_verify_number($idcard);
    return $idcard;
}


/**
 * 18位身份证校验码有效性检查
 */
function idcard_checksum18($idcard)
{
    if (strlen($idcard) != 18) {
        return false;
    }
    $aCity = array(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 => "国外");
    //非法地区
    if (!array_key_exists(substr($idcard, 0, 2), $aCity)) {
        return false;
    }
    //验证生日
    if (!checkdate(substr($idcard, 10, 2), substr($idcard, 12, 2), substr($idcard, 6, 4))) {
        return false;
    }
    $idcard_base = substr($idcard, 0, 17);
    if (idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))) {
        return false;
    } else {
        return true;
    }
}


/**
 * 国内护照
 * 1.G|E+8位数字:如:G12345678
 * 2.D|S|P+7位数字:如:D1234567
 */
function passportVerify($content)
{
    $pattern = "/^[w]{5,17}$/";
    return preg_match($pattern, $content);
}


/**
 * 台胞证:
 * 1、8位数字,如:12345678
 * 2、10位数字+(1位英文字母),如:1234567890(T)
 */
function taibaoVerify($content)
{
    $pattern_one = "/^[d]{8}$/";
    $pattern_two = "/^[d]{10}[(|(][a-zA-z][)|)]$/iu";
    return (preg_match($pattern_one, $content) || preg_match($pattern_two, $content));
}

/**
 * 赴台证:
 * 1.T+8位数字
 * 2.25+7位数字
 */
function twpassport_verify($content)
{
    $pattern = "/^25d{7}$|^Td{8}$/";
    if (!preg_match($pattern, $content)) {
        return false;
    }
    return true;
}


/**
 * 军官证
 * X字+8位,如:南字12345678
 */
function junguanVerify($content)
{
    if (mb_strlen($content) != 10) {
        return false;
    }
    $check = preg_match("/^[x{4e00}-x{9fa5}]{1}x{5b57}$/u", mb_substr($content, 0, 2));
    if ($check && preg_match("/^d{8}$/u", mb_substr($content, 2, 8))) {
        return true;
    }
    return false;
}