짧은 말
사용자의 실명 검증을 할 때 주민등록번호의 정규 표현식과 인증 체계를 자주 사용한다. 이 문서에서는 실제 프로젝트 상황에 따라 적절한 시나리오를 선택할 수 있는 두 가지 검증 시나리오를 나열합니다.
ID 번호 설명
주민등록번호가 정확하고 공식적인 명칭은' 시민권번호' 여야 한다. 중화인민공화국 국가표준인 GB11643-1999 에 따르면 시민권번호는 17 자리 디지털 본체 코드와 숫자로 구성된 피쳐 조합 코드입니다. 왼쪽에서 오른쪽으로 순서는 6 자리 주소 코드, 8 자리 생년월일 코드, 3 자리 시퀀스 코드, 1 자리 검사 코드입니다.
베이징 조양구의 한 여성 주민등록번호를 예로 들어 보겠습니다. ID 번호의 의미는 다음 그림과 같습니다.
주: 주민등록번호는 GB11643-1999 에서 나옵니다.
0 부터 전체 주민등록번호 확인 과정을 마치겠습니다.
시나리오 1 (단순)
1..1분할 규칙
1..1.1주소 코드 규칙: 주소 코드 길이는 6 자리입니다.
숫자 1-9 로 시작합니다.
마지막 다섯 개의 숫자는 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 | 3/kloc 을 작성합니다
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
//출력 true
Console.log (p.test ("1101051949/kr
//출력 false 는 0 으로 시작할 수 없습니다.
Console.log (p.test ("0101051949120
//출력 휴가 연도는 17 로 시작할 수 없습니다.
Console.log (p.test ("1101051749/kr
//수출휴가월은 13 이 될 수 없습니다.
Console.log (p.test ("1101051949/kr
//출력 휴가 날짜는 32 가 될 수 없습니다.
Console.log (p.test ("1101051949/kr
//출력 false 는 로 끝날 수 없습니다.
Console.log (p.test ("1101051949/kr 1.3 시나리오 분석
시나리오 1 은 기본적인 형식 판단일 뿐, 주로 세 가지 단점이 있습니다.
주소 코드가 정확하지 않습니다. 예: 국내에는16,26 으로 시작하는 지역이 없지만, 사찰 날짜를 통해 충분히 정확하지 않다고 판단할 수 있다. 예: 1949023 1 도 확인할 수 있지만 2 월에는 3 1 패리티 코드가 없고 17 비트 본체 코드로 계산됩니다
시나리오 1 의 부족에 대해 시나리오 2 를 도입하여 시나리오 1 의 부족을 개선합니다.
2. 1 지방 주소 코드 확인
북중국: 베이징 1 1, 천진 12, 하북성 13, 산서 14
동북: 요녕 2 1, 길림 22, 흑룡강 23
화동: 상하이 3 1, 장쑤 32, 절강 33, 안후이 34, 푸젠 35, 강서 36, 산둥 37.
화중: 하남 4 1, 호북 42, 호남 43
남 중국: 광동 44, 광시 45, 하이난 46
서남: 쓰촨 5 1, 구이저우 52, 운남 53, 티베트 54, 충칭 50.
서북: 산시 6 1, 간쑤 62, 청해 63, 닝샤 64, 신장 65.
특별: 대만성 7 1, 홍콩 8 1, 마카오 82
위의 주소 코드에 따르면 주민등록번호의 처음 두 자리를 검사해 정확도를 더욱 높였다. 현주소 코드는 20 13 판 행정구역 코드 GB/T2260 을 기준으로 합니다. 구역 코드의 역사적 진화로 주소 코드의 마지막 네 자리 숫자를 확인할 수 없다. 통통한 주민등록번호를 예로 들어 보겠습니다. 제 번호는 232 1 으로 시작하는데, 현재 행정구역 코드표에는 이 코드가 없습니다. 따라서 이 문서에서는 처음 두 지방의 주소 코드만 확인합니다.
9 1 은 외국인이 받은 중국 주민등록번호의 처음 두 자리 숫자로 시작했다는 말도 있지만 확인되지 않았습니다. 9 1 로 시작하는 신분증이 있거나 마브리를 아는 경우 관련 정보를 확인해 주세요.
위의 분석에 따르면, 지방 주소 코드의 검증 및 테스트 절차는 다음과 같습니다.
Var checkProv = function (val) {
Var 모드 =/[1-9] [0-9]/;
Var provs = {1 1: "베이징", 12: "천진", 13: 33: "절강", 34: "안후이", 35: "복건", 36: "장시", 37: "산둥", 4 1: "허난" 6 1: "산시", 62: "간쑤", 63: "청해", 64: "닝샤", 65: "신장", 7/KLOC-
If (패턴. 테스트 (val)) {
If(provs[val]) {
True 를 반환합니다
}
}
False 를 반환합니다
}
//출력 참, 37 은 산둥.
Console.log (checkprov (37));
//출력 false, 16 이 존재하지 않습니다.
Console.log (checkprov (16)); 2.2 생년월일 코드 검증
생년월일 코드의 검증을 해석하지 않고 다음과 같은 기능과 테스트 단계를 직접 제공합니다.
Var checkDate = function (val) {
Var 모드 =/(18 |19 | 20) \ d {2} ((0 [1-9])
If (패턴. 테스트 (val)) {
Varyear = val.substring (0,4);
Varmonth = val.substring (4,6);
Vardate = val.substring (6,8);
Var date2 = 새 날짜 (연도+"-"+월+"-"+날짜);
(날짜& & ampdate2.getmonth () = = (parse int (month)-1)) {
True 를 반환합니다
}
}
False 를 반환합니다
}
//출력 true
Console.log (checkdate ("20180212"));
//Output false 2 월에는 3 1 일이 없습니다.
Console.log (checkdate ("20180231")); 2.3 패리티 검사 코드 검사
패리티 검사 코드의 계산은 약간 복잡하며 먼저 다음 공식을 제공합니다.
여기서 ai 는 ID 코드의 I 번째 값을 나타내고 Wi 는 I 번째 가중치 계수 값을 나타냅니다.
가중 계수 테이블 1:
I12345678 wi7910584219101/kloc
X012345678910a1810x98765432 알고리즘 프로세스:
주민등록번호 계정 인코딩 (앞 17 비트) 및 해당 가중 계수 (표 1) 를 기준으로 곱 합을 계산하여 결과 및 1 1 을 x 로 모읍니다
X 값 체크리스트 2 에 따라 a 18, 즉 검사 코드 값을 얻습니다.
코드 계산 프로그램을 확인하고 다음 코드를 테스트하십시오.
Var checkCode = function (val) {
Var p =/[1-9] \ d {5} (18 |19 | 20) \ d
Var 계수 = [7,9, 1 0,5,8,4,2,1,6,3,7,9,/kloc]
Var parity = [1, 0,' x', 9,8,7,6,5,4,3,2];
Var 코드 = val.substring (17);
If(p.test(val)) {
Varsum = 0;
For(var I = 0;; 나< 17; I++) {
Sum+= val [I] * factor [I];
}
If (parity [sum%11] = = code.touppercase ()) {
True 를 반환합니다
}
}
False 를 반환합니다
}
//출력 true, 체크 코드 일치.
Console.log (checkcode ("1101051949/klls)
//출력 false, 검사 코드가 일치하지 않습니다.
Console.log (checkcode ("1101051949/klls) 2.4 시나리오 2 전체 코드
Var checkID = function (val) {
If (체크 코드 (val)) {
Var date = val.substring(6,14);
If (검사 날짜 (날짜)) {
If (checkprov (val.substring (0,2)) {
True 를 반환합니다
}
}
}
False 를 반환합니다
}
//출력 true
Console.log (checkid ("1101051949/kloc
//출력 false, 검사 코드가 일치하지 않습니다.
Console.log (checkid ("1101051949/kloc
//출력 false, 날짜 코드가 일치하지 않습니다.
Console.log (checkid ("1101051949023/kr
//출력 false, 지역 번호가 일치하지 않습니다.
Console.log (checkid ("1601051949123/ 이 사건을 다 보고 나면, 너는 이미 방법을 익혔다고 믿는다. 더 흥미 진진한 Gxl 의 다른 관련 웹 문장!
추천 읽기:
Vue.js 사용자 정의 이벤트가 양식에 들어가는 방법입니다.
Vue.js 는 어떻게 그림을 자유롭게 끌 수 있습니까?
Vue2.0axios 를 사용하여 도메인 간 및 렌더링을 어떻게 사용합니까?