Кратко
При проверке реального имени пользователя часто используются регулярные выражения и схемы проверки идентификационных номеров. В этой статье перечислены две схемы проверки, вы можете выбрать подходящую схему в соответствии с реальной ситуацией вашего проекта.
Описание идентификационного номера
Идентификационный номер резидента, правильное и официальное название должно быть «идентификационный номер гражданина». В соответствии с положениями об идентификационном номере гражданина в [Национальном стандарте Китайской Народной Республики GB 11643-1999] идентификационный номер гражданина представляет собой код комбинации признаков, который состоит из семнадцатизначного кода тела и однозначного контрольного кода. . Порядок слева направо: шестизначный адресный код, восьмизначный код даты рождения, трехзначный код последовательности и однозначный контрольный код.
Возьмем в качестве примера женский номер удостоверения личности в районе Чаоян в Пекине. Значение номера удостоверения личности показано на следующем рисунке:
Примечание. Идентификационный номер из GB [GB 11643-1999].
Далее мы завершим полный процесс проверки идентификационного номера с нуля.
Вариант 1 (простой)
1.1 Правила дивизиона
Сначала мы предлагаем схему 1 и шаг за шагом определяем следующие правила:
1.1.1 Правила кодирования адреса:
- Код адреса состоит из 6 цифр.
- начинается с цифр 1-9
- Последние 5 цифр это цифры 0-9
По вышеизложенным правилам напишите регулярное выражение кода адреса:/^[1-9]\d{5}/
1.1.2 Правила кода года:
- Код года состоит из 4 цифр.
- начинается с цифр 18, 19 или 20
- Оставшиеся две цифры 0-9
Согласно приведенным выше правилам напишите регулярное выражение кода года:/(18|19|20)\d{2}/
. Если вам не нужен год, начинающийся с 18, вы можете отказаться от 18.
1.1.3 Правила кода месяца:
- Код месяца состоит из 2 цифр.
- Первая цифра 0, вторая цифра 1-9
- Или первая цифра 1, а вторая цифра 0-2
Согласно приведенным выше правилам напишите регулярное выражение кода месяца:/((0[1-9])|(1[0-2]))/
.
1.1.4 Правила кода даты:
- Код даты состоит из 2 цифр.
- Первая цифра 0-2, вторая цифра 1-9
- или 10, 20, 30, 31
Согласно приведенным выше правилам напишите регулярное выражение кода даты:/(([0-2][1-9])|10|20|30|31)/
.
1.1.5 Правила кода последовательности:
- Код последовательности состоит из 3 цифр.
- коды последовательности - это числа
Согласно приведенным выше правилам напишите регулярное выражение кода последовательности:/\d{3}/
.
1.1.6 Правила проверки кода:
- Длина контрольного кода 1 цифра
- Может быть числом, буквой x или буквой X
Согласно приведенным выше правилам напишите регулярное выражение кода проверки:/[0-9Xx]/
.
1.2 Схема 1 Регулярное выражение
Комбинируя приведенные выше 6 правил, полное регулярное выражение и тестовая программа выглядят следующим образом:
var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
//输出 true
console.log(p.test("11010519491231002X"));
//输出 false 不能以0开头
console.log(p.test("01010519491231002X"));
//输出 false 年份不能以17开头
console.log(p.test("11010517491231002X"));
//输出 false 月份不能为13
console.log(p.test("11010519491331002X"));
//输出 false 日期不能为32
console.log(p.test("11010519491232002X"));
//输出 false 不能以a结尾
console.log(p.test("11010519491232002a"));
1.3 Анализ схемы 1
Схема 1 дает только базовую оценку формата и имеет три основных недостатка:
- Определение кода адреса недостаточно точное. Пример: моей страны нет в регионах, начинающихся с 16 и 26, но она может пройти проверку
- Определение даты недостаточно точное. Пример: 19490231 тоже можно проверить, но 31 числа в феврале не существует.
- Код проверки вычисляется из 17-битного кода онтологии, и схема 1 этот код не проверяет
Вариант 2 (комплексный)
В соответствии с недостатками схемы 1 вводится схема 2 для улучшения недостатков схемы 1.
2.1 Проверка провинциального адресного кода
Северный Китай: Пекин 11, Тяньцзинь 12, Хэбэй 13, Шаньси 14, Внутренняя Монголия 15
Северо-восток: Ляонин 21, Цзилинь 22, Хэйлунцзян 23
Восточный Китай: Шанхай 31, Цзянсу 32, Чжэцзян 33, Аньхой 34, Фуцзянь 35, Цзянси 36, Шаньдун 37
Центральный Китай: Хэнань 41, Хубэй 42, Хунань 43
Южный Китай: Гуандун 44, Гуанси 45, Хайнань 46
Юго-запад: Сычуань 51, Гуйчжоу 52, Юньнань 53, Тибет 54, Чунцин 50
Северо-запад: Шэньси 61, Ганьсу 62, Цинхай 63, Нинся 64, Синьцзян 65.
Особые: Тайвань 71, Гонконг 81, Макао 82
Первые две цифры номера удостоверения личности проверяются в соответствии с указанным выше адресным кодом для дальнейшего повышения точности. Текущий адресный код основан на версии кода административной единицы 2013 года [GB/T2260]. Из-за исторической эволюции кода зонирования невозможно проверить последние четыре цифры кода адреса. Возьмем, к примеру, идентификационный номер Санпанга, мой номер начинается с 2321, а в текущей таблице кодов административных единиц такого кода нет. Поэтому в этой статье проверяются только первые два провинциальных адресных кода.
Также есть утверждения, что начало 91 года — это первые два кода китайского идентификационного номера, полученные иностранцами, но мной они не подтверждены. Если у вас есть удостоверение личности, начинающееся с 91, или вы знаете Marbury, помогите подтвердить соответствующую информацию.
Согласно приведенному выше анализу, процедуры проверки и проверки провинциального адресного кода приведены ниже:
var checkProv = function (val) {
var pattern = /^[1-9][0-9]/;
var provs = {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:"澳门"};
if(pattern.test(val)) {
if(provs[val]) {
return true;
}
}
return false;
}
//输出 true,37是山东
console.log(checkProv(37));
//输出 false,16不存在
console.log(checkProv(16));
2.2 Проверка кода даты рождения
Проверка кода даты рождения не поясняется, а непосредственно даются следующие функции и процедуры проверки:
var checkDate = function (val) {
var pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
if(pattern.test(val)) {
var year = val.substring(0, 4);
var month = val.substring(4, 6);
var date = val.substring(6, 8);
var date2 = new Date(year+"-"+month+"-"+date);
if(date2 && date2.getMonth() == (parseInt(month) - 1)) {
return true;
}
}
return false;
}
//输出 true
console.log(checkDate("20180212"));
//输出 false 2月没有31日
console.log(checkDate("20180231"));
2.3 Проверить верификацию кода
Расчет контрольного кода несколько усложнен, и сначала приводится следующая формула:
Среди них ai представляет собой i-е значение основного кода удостоверения личности, а Wi представляет i-е значение весового коэффициента.
Таблица весовых коэффициентов [Таблица 1]:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
Wi | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
X и проверьте таблицу преобразования кодов [Таблица 2]
X | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
a18 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
Алгоритмический процесс:
- По основному коду удостоверения личности (первые 17 цифр) и соответствующему весовому коэффициенту (таблица 1) рассчитывается произведение, затем суммируется, и по полученному результату получается значение Х по модулю 11.
- В соответствии со значением X просмотрите Таблицу 2 и получите значение a18, которое является значением контрольного кода.
Программа расчета контрольного кода и тест показаны в следующем коде:
var checkCode = function (val) {
var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
var code = val.substring(17);
if(p.test(val)) {
var sum = 0;
for(var i=0;i<17;i++) {
sum += val[i]*factor[i];
}
if(parity[sum % 11] == code.toUpperCase()) {
return true;
}
}
return false;
}
// 输出 true, 校验码相符
console.log(checkCode("11010519491231002X"));
// 输出 false, 校验码不符
console.log(checkCode("110105194912310021"));
2.4 Общий код схемы 2
var checkID = function (val) {
if(checkCode(val)) {
var date = val.substring(6,14);
if(checkDate(date)) {
if(checkProv(val.substring(0,2))) {
return true;
}
}
}
return false;
}
//输出 true
console.log(checkID("11010519491231002X"));
//输出 false,校验码不符
console.log(checkID("110105194912310021"));
//输出 false,日期码不符
console.log(checkID("110105194902310026"));
//输出 false,地区码不符
console.log(checkID("160105194912310029"));
Вышеупомянутое понимание и анализ Sanpang проверки номера удостоверения личности.Если есть какие-либо недостатки, пожалуйста, поправьте меня.
Известный физик Стивен Хокинг скончался 14 марта 2018 года в возрасте 76 лет. Знающий и интересный человек, во всем!
В мире не будет Хокинга, и время никогда не оставит краткую историю!