身份证号码验证

/**
 * 验证台湾地区10位身份证号码
 * 10位
 * 英文 县市 / 地区 验证码(数字)

    A 台北市 10

    B 台中市 11

    C 基隆市 12

    D 台南市 13

    E 高雄市 14

    F 台北县 15

    G 宜兰县 16

    H 桃园县 17

    I 嘉义市 34

    J 新竹县 18

    K 苗栗县 19

    L 台中县 20

    M 南投县 21

    N 彰化县 22

    O 新竹市 35

    P 云林县 23

    Q 嘉义县 24

    R 台南县 25

    S 高雄县 26

    T 屏东县 27

    U 花莲县 28

    V 台东县 29

    W 金门县 32

    X 澎湖县 30

    Y 阳明山管理局 31

    Z 连江县 33

    二、数字编码

    首位数字代表性别,男性为1、女性为2;最后一位数字是检验码;其它是电脑系统给码。

    三、身份证验证

    最后一位数字是检验码,通过公式计算得到。计算公式如下:

    通算值= 首字母对应的第一位验证码+ 首字母对应的第二位验证码 * 9 + 性别码 * 8 + 第二位数字 * 7 + 第三位数字 * 6 + 第四位数字 * 5 + 第五位数字 * 4 + 第六位数字 * 3 + 第七位数字 * 2 + 第八位数字 * 1

    最后一位数 =10- 通算值的末尾数。

    例如,A234567893,A对应的验证码是10,最后一位数是3。通算值= 1 + 0*9 + 2*8 + 3*7 + 4*6 + 5*5 + 6*4 + 7*3 + 8*2 + 9*1 = 157,通算值的末尾数是7。则10-7=3,与最后一位数(验证码)相同,身份证号码正确。反之,A234567890的最后一位是0,就不是有效字号。
 */
function checkTWID($str) {
    if(!preg_match('/^[A-Za-z][12]\d{8}$/', $str)) {
        return false;
    } else {
        // 计算通算值
        $yzmArr = [
            'A' => [
                'region' => '台北市',
                'yzm' => 10
            ],
            'B' => [
                'region' => '台中市',
                'yzm' => 11
            ],
            'C' => [
                'region' => '基隆市',
                'yzm' => 12
            ],
            'D' => [
                'region' => '台南市',
                'yzm' => 13
            ],
            'E' => [
                'region' => '高雄市',
                'yzm' => 14
            ],
            'F' => [
                'region' => '台北县',
                'yzm' => 15
            ],
            'G' => [
                'region' => '宜兰县',
                'yzm' => 16
            ],
            'H' => [
                'region' => '桃园县',
                'yzm' => 17
            ],
            'I' => [
                'region' => '嘉义市',
                'yzm' => 34
            ],
            'J' => [
                'region' => '新竹县',
                'yzm' => 18
            ],
            'K' => [
                'region' => '苗栗县',
                'yzm' => 19
            ],
            'L' => [
                'region' => '台中县',
                'yzm' => 20
            ],
            'M' => [
                'region' => '南投县',
                'yzm' => 21
            ],
            'N' => [
                'region' => '彰化县',
                'yzm' => 22
            ],
            'O' => [
                'region' => '新竹市',
                'yzm' => 35
            ],
            'P' => [
                'region' => '云林县',
                'yzm' => 23
            ],
            'Q' => [
                'region' => '嘉义县',
                'yzm' => 24
            ],
            'R' => [
                'region' => '台南县',
                'yzm' => 25
            ],
            'S' => [
                'region' => '高雄县',
                'yzm' => 26
            ],
            'T' => [
                'region' => '屏东县',
                'yzm' => 27
            ],
            'U' => [
                'region' => '花莲县',
                'yzm' => 28
            ],
            'V' => [
                'region' => '台东县',
                'yzm' => 29
            ],
            'W' => [
                'region' => '金门县',
                'yzm' => 32
            ],
            'X' => [
                'region' => '澎湖县',
                'yzm' => 30
            ],
            'Y' => [
                'region' => '阳明山管理局',
                'yzm' => 31
            ],
            'Z' => [
                'region' => '连江县',
                'yzm' => 33
            ]
        ];
        $yzm = $yzmArr[strtoupper(substr($str,0, 1))]['yzm'];
        $tongsuan = substr($yzm, 0, 1) + substr($yzm, 1, 1) * 9;
        for($i = 1;$i < 9;$i++) {
            $tongsuan += substr($str, $i, 1) * (9 - $i);
        }
        // 判断结果
        if((10 - substr($tongsuan, -1, 1)) === intval(substr($str, 9, 1))) {
            return true;
        } else {
            return false;
        }
    }
}

上面是台湾地区10位身份证号码验证(^)

 

下面是大陆,港澳内地通行证,台身份证(8或10位)验证

/^(([1-9]\d{5}(19|20)\d{2}[01]\d[0123]\d\d{3}[xX\d])|([A-Za-z][12]\d{8})|(\d{8})|([hHmM]\d{10}))$/

 PS:台湾10位网上搜到了,8位是因为有个台湾客户提供的,还不清楚哪款是新版

港澳居民来往内地通行证(以下简称通行证,式样见附件1)于1999年1月15日启用。通行证为卡式证件,通行证有效期分为3年和10年两种,持证人年满18周岁的为10年有效,未满18周岁的为3年有效。 通行证号码组成规则:通行证证件号码共11位。第1位为字母,“H”字头签发给香港居民,“M”字头签发给澳门居民;第2位至第11位为数字,前8位数字为通行证持有人的终身号,后2位数字表示换证次数,首次发证为00,此后依次递增。

 

台湾地区身份证号码第一位所代表的区域地区后面的数字为该字母转换的数字码  A 台北市10  B台中市11  C基隆市12  D台南市13  E高雄市14  F 新北市15  G宜兰县16  H桃园市17 I嘉义市34  J新竹县18  K苗栗县19  M南投县21  N彰化县22  O新竹市35  P云林县23  Q嘉义县24  R台南县25  S高雄县26  T屏东县27  U花莲县28  V台东县29  W金门县32  X澎湖县30  Z连江县33已停发字母 L台中县20 R台南县25 S高雄县26 Y阳明山31

台湾地区身份证号码计算方法

把前9码所代表的数字列出来,再乘以他的加权数(我记得是10~1) 接下来全部加起来,然后总和以10去除,取余数之后 以10来减那个余数之后得到的那个数字再以10去除取余数之后那个数字就是最后一个判别码;  第十位数字——验证码的计算规则为:  字母(ABCDEFGHJKLMNPQRSTUVXYWZIO)对应一组数(10——35)。 令其十位数为X1,个位数为X2; D2到D9分别代表身份证号码的第二至第九位数。Y=X1+9×X2+8×D2+7×D3+6×D4+5×D5+4×D6+3×D7+2×D8+1×D9 将Y的值除以10。得出的余数结果。 再用10来减去这个余数结果。就得出身份证上的最后一位数字。 例如R123456783,R=25, 检查公式是:2+5*9+1*8+2*7+3*6+4*5+5*4+6*3+7*2+8*1=167, 其167再除以10求余数结果。 其余数结果的个位数为7以10减去得3(检查码)。

posted @ 2019-11-25 14:55  study_php_java_C++  阅读(1022)  评论(0编辑  收藏  举报