台湾地区身份证号码验证

台湾地区身份证号码验证

/**
 * 验证台湾地区身份证号码
 * 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;
        }
    }
}

台湾地区身份证号码验证

 
12-28 00:30