다음은 ID 번호 인코딩 규칙에 따라 JS를 사용한 유효성 검증 코드입니다.
Idcard-Validate.js 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
/**
* ID 카드의 15 비트 인코딩 규칙 : DDDDDD YYMMDD XX P
* DDDDDD : 지역 코드
* yymmdd : 생년월일
* xx : 순차적 클래스 인코딩은 결정할 수 없습니다
* P : 성별, 홀수 숫자는 남성이며 숫자는 여성입니다.
* <p />
* ID 카드의 18 비트 인코딩 규칙 : DDDDDD YYYYMMDD XXX Y
* DDDDDD : 지역 코드
* yyyymmdd : 생년월일
* xxx : 서열 유형 인코딩, 결정할 수없고, 홀수는 수컷이고, 숫자도 여성입니다.
* Y : 코드 확인,이 숫자의 값은 처음 17 자리를 통해 얻을 수 있습니다.
* <p />
* 18 자리 수의 가중치 계수는 (오른쪽에서 왼쪽에서 왼쪽으로) WI = [7, 9, 10, 5, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
* 검증 비트 Y = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]
* 체크 비트 계산 공식 : y_p = mod (∑ (ai × wi), 11)
* i는 오른쪽에서 왼쪽으로 ID 번호의 2 숫자입니다.
*
*/
var wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; // 가중치 계수
var valideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]; // ID 카드 확인 비트 값은 x를 나타냅니다.
함수 idcardValidate (idcard) {
idcard = trim (idcard.replace ( / / g, "");
if (idcard.length == 15) {
반환 ISVALIDITYBRITHBY15IDCARD (IDCARD);
} else if (idcard.length == 18) {
var a_idcard = idcard.split ( ""); // ID 카드 배열을 가져옵니다
if (isvaliditybrithby18idcard (idcard) && istruevalidatecodeby18idcard (a_idcard)) {
진실을 반환하십시오.
}또 다른 {
거짓을 반환합니다.
}
} 또 다른 {
거짓을 반환합니다.
}
}
/**
* ID 번호가 18 자리 일 때 마지막 확인 비트가 올바른지 확인
* @param a_idcard ID 번호 배열
* @반품
*/
함수 istruevalidatecodeby18idcard (a_idcard) {
var sum = 0; // 가중 합계 변수를 선언합니다
if (a_idcard [17] .tolowercase () == 'x') {
A_IDCARD [17] = 10; // 후속 작업의 경우 검증 코드를 마지막 비트 X로 10으로 바꾸십시오.
}
for (var i = 0; i <17; i ++) {
sum += wi [i] * a_idcard [i]; // 가중 합계
}
valcodeposition = sum % 11; // 확인 코드를 가져올 위치
if (a_idcard [17] == validecode [valcodeposition]) {
진실을 반환하십시오.
} 또 다른 {
거짓을 반환합니다.
}
}
/**
*ID 카드를 통해 남자인지 여자인지 판단
* @param idcard 15/18 자리 ID 번호
* @return '여성'-여성, 'Male'-Male
*/
함수 maleorfemalbyidcard (idcard) {
idcard = trim (idcard.replace (// g, ""); // ID 번호를 처리합니다. 캐릭터 사이의 공간을 포함합니다.
if (idcard.length == 15) {
if (idcard.substring (14,15)%2 == 0) {
'여성'반품;
}또 다른{
'남성'을 반환합니다.
}
} else if (idcard.length == 18) {
if (idcard.substring (14,17)%2 == 0) {
'여성'반품;
}또 다른{
'남성'을 반환합니다.
}
}또 다른{
널 리턴;
}
// 들어오는 문자는 배열로 직접 처리 할 수 있습니다.
// if (idcard.length == 15) {
// 경고 (Idcard [13]);
// if (idcard [13]%2 == 0) {
// '여성'반환;
// }또 다른{
// 반환 '남성';
//}
//} else if (idcard.length == 18) {
// Alert (Idcard [16]);
// if (idcard [16]%2 == 0) {
// '여성'반환;
// }또 다른{
// 반환 '남성';
//}
// }또 다른{
// null을 반환합니다.
//}
}
/**
* 18 자리 ID 번호의 생일이 유효한 생일인지 확인
* @param idcard 18 비트 북 ID 문자열
* @반품
*/
함수 ISVALIDITYBRITHBY18IDCARD (idcard18) {
var year = idcard18.substring (6,10);
var month = idcard18.substring (10,12);
var day = idcard18.substring (12,14);
var temp_date = 새 날짜 (연도, parsefloat (월) -1, parsefloat (day));
// 여기에서 getlylyear ()를 사용하여 밀레니엄 버그의 문제를 피하기 위해 연도를 얻으십시오.
if (temp_date.getlyear ()! = parsefloat (년)
|| temp_date.getmonth ()! = parsefloat (Month) -1
|| temp_date.getDate ()! = parsefloat (day)) {
거짓을 반환합니다.
}또 다른{
진실을 반환하십시오.
}
}
/**
* 15 자리 ID 번호의 생일이 유효한 생일인지 확인
* @param idcard15 15 비트 북 ID 문자열
* @반품
*/
함수 ISVALIDITYBRITHBY15IDCARD (idcard15) {
var year = idcard15.substring (6,8);
var month = idcard15.substring (8,10);
var day = idcard15.substring (10,12);
var temp_date = 새 날짜 (연도, parsefloat (월) -1, parsefloat (day));
// 이전 ID 카드의 나이에 대해서는 천년 벌레 문제를 고려하고 getyear () 방법을 사용할 필요가 없습니다.
if (temp_date.getyear ()! = parsefloat (년)
|| temp_date.getmonth ()! = parsefloat (Month) -1
|| temp_date.getDate ()! = parsefloat (day)) {
거짓을 반환합니다.
}또 다른{
진실을 반환하십시오.
}
}
// 문자열 헤드와 테일 공간을 제거합니다
기능 트림 (str) {
return str.replace (/(^/s*) | (/s*$)/g, "");
}
업데이트 된 버전 2
코드 사본은 다음과 같습니다.
함수 checkidcard (num)
{
num = num.toupperCase ();
// ID 카드 번호는 15 자리가되면 18 자리의 첫 번째 숫자는 숫자 또는 문자 X 일 수 있습니다.
if (! (/(/(^/d {15} $) | (^/d {17} ([0-9] | x) $)/. test (num)))))
{
// ALERT ( '입력 된 ID 번호의 길이가 잘못되었거나 숫자가 요구 사항을 충족하지 않습니다! /N15 자리 숫자는 모두 숫자가되어야하며 마지막 18 자리 숫자는 숫자 또는 X.'가 될 수 있습니다);
거짓을 반환합니다.
}
// 점검 비트는 ISO 7064 : 1983의 조항에 따라 생성됩니다. MOD 11-2 및 X는 숫자 10으로 간주 될 수 있습니다.
// 다음은 생년월일 및 숫자를 확인합니다.
var len, Re;
len = num.length;
if (len == 15)
{
re = new regexp (/^(/d {6}) (/d {2}) (/d {2}) (/d {2}) (/d {2}) (/d {3}) $ /);
var arrsplit = num.match (re);
// 생일 날짜가 올바른지 확인하십시오
var dtmbirth = 새 날짜 ('19 ' + arrsplit [2] +'/' + arrsplit [3] +'/' + arrsplit [4]);
var bgoodday;
bgoodday = (dtmbirth.getyear () == number (arrsplit [2])) && (((dtmbirth.getmonth () + 1)) == number (arrsplit [3])) && (dtmbirth.getDate () == n Umber (arrsplit [4]);
if (! bgoodday)
{
// ALERT ( '입력 된 ID 번호의 생년월일이 잘못되었습니다!');
거짓을 반환합니다.
}
또 다른
{
// 15 자리 ID 카드를 18 자리로 변환합니다
// 점검 비트는 ISO 7064 : 1983의 조항에 따라 생성됩니다. MOD 11-2 및 X는 숫자 10으로 간주 될 수 있습니다.
var arrint = 새 배열 (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrch = 새로운 배열 ( '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2'))) ;
var ntemp = 0, i;
num = num.substr (0, 6) + '19' + num.substr (6, num.length -6);
for (i = 0; i <17; i ++)
{
ntemp += num.substr (i, 1) * arrint [i];
}
num += arrch [ntemp % 11];
진실을 반환하십시오.
}
}
if (len == 18)
{
re = new regexp (/^(/d {6}) (/d {4}) (/d {2}) (/d {2}) (/d {3}) ([0-9] | x ) $/);
var arrsplit = num.match (re);
// 생일 날짜가 올바른지 확인하십시오
var dtmbirth = 새 날짜 (arrsplit [2] + "/" + arrsplit [3] + "/" + arrsplit [4]);
var bgoodday;
bgoodday = (dtmbirth.getFelyEar () == number (arrsplit [2])) && (((dtmbirth.getmonth () + 1)) == number (arrsplit [3])) && (dtmbirth.getDate () == number ( arrsplit [4]);
if (! bgoodday)
{
// alert (dtmbirth.getyear ());
// alert (arrsplit [2]);
// ALERT ( '입력 된 ID 번호의 생년월일이 잘못되었습니다!');
거짓을 반환합니다.
}
또 다른
{
// 18 자리 ID 카드의 확인 코드가 올바른지 확인하십시오.
// 점검 비트는 ISO 7064 : 1983의 조항에 따라 생성됩니다. MOD 11-2 및 X는 숫자 10으로 간주 될 수 있습니다.
var valnum;
var arrint = 새 배열 (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrch = 새로운 배열 ( '1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2'))) ;
var ntemp = 0, i;
for (i = 0; i <17; i ++)
{
ntemp += num.substr (i, 1) * arrint [i];
}
valnum = Arrch [ntemp % 11];
if (valnum! = num.substr (17, 1))
{
// ALERT ( '18 비트 ID 카드의 확인 코드가 잘못되었습니다!' + valnum);
거짓을 반환합니다.
}
진실을 반환하십시오.
}
}
거짓을 반환합니다.
}