以下は、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、8、4、2、1、6、3、7、9、10、5、8、4、8、8、4、 2、1]
*検証ビットy = [1、0、10、9、8、7、6、5、4、3、2]
*チェックビットの計算式:y_p = mod(∑(ai×wi)、11)
* Iは、右から左へのID番号の18桁です。
*
*/
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カード検証ビット値。
関数idcardvalidate(idcard){
idcard = trim(idcard.replace( / / g、 ""));
if(idcard.length == 15){
usaliditybrithby15idcard(idcard)を返します。
} else if(idcard.length == 18){
var a_idcard = idcard.split( ""); // IDカードアレイを取得します
if(isvaliditybrithby18idcard(idcard)&& istruevalidatecodeby18idcard(a_idcard)){
trueを返します。
}それ以外 {
falseを返します。
}
} それ以外 {
falseを返します。
}
}
/**
* 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]){
trueを返します。
} それ以外 {
falseを返します。
}
}
/**
*IDカードを介して男性か女性かを判断する
* @param idcard 15/18桁のID番号
* @return 'female'-female'-male
*/
function 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){
「女性」を返します。
}それ以外{
「男性」を返します。
}
}それ以外{
nullを返します。
}
//着信文字は配列として直接処理できます
// if(idcard.length == 15){
// alert(idcard [13]);
// if(idcard [13]%2 == 0){
//「女性」を返します。
// }それ以外{
// 'MALE'を返します。
//}
//} else if(idcard.length == 18){
// alert(idcard [16]);
// if(idcard [16]%2 == 0){
//「女性」を返します。
// }それ以外{
// 'MALE'を返します。
//}
// }それ以外{
// nullを返します。
//}
}
/**
* 18桁のID番号の誕生日が有効な誕生日であるかどうかを確認してください
* @param idcard 18ビットブックID文字列
* @戻る
*/
function asaliditybrithby18idcard(idcard18){
var year = idcard18.substring(6,10);
var month = idcard18.substring(10,12);
var day = idcard18.substring(12,14);
var temp_date = new Date(year、parsefloat(month)-1、parsefloat(day));
//ここでgetflyear()を使用して、ミレニアムバグの問題を避けるために年を取得する
if(temp_date.getFullyear()!= parsefloat(year)
|| temp_date.getmonth()!= parsefloat(month)-1
|| temp_date.getDate()!= parsefloat(day)){
falseを返します。
}それ以外{
trueを返します。
}
}
/**
* 15桁のID番号の誕生日が有効な誕生日であるかどうかを確認してください
* @param idcard15 15ビットブックID文字列
* @戻る
*/
function asaliditybrithby15Idcard(idcard15){
var year = idcard15.substring(6,8);
var month = idcard15.substring(8,10);
var day = idcard15.substring(10,12);
var temp_date = new Date(year、parsefloat(month)-1、parsefloat(day));
//古いIDカードの年齢については、ミレニアムワームの問題を考慮してgetYear()メソッドを使用する必要はありません
if(temp_date.getyear()!= parsefloat(year)
|| temp_date.getmonth()!= parsefloat(month)-1
|| temp_date.getDate()!= parsefloat(day)){
falseを返します。
}それ以外{
trueを返します。
}
}
//文字列ヘッドとテールスペースを削除します
関数トリム(str){
return str.replace(/(^/s*)|(/s*$)/g、 "");
}
更新されたバージョン2
コードコピーは次のとおりです。
関数checkidcard(num)
{
num = num.touppercase();
// IDカード番号は、15桁の数字です。
if(!(/(^/d {15} $)|(^/d {17}([0-9] | x)$)/。テスト(num)))))
{
// alert( '入力されたID番号の長さが間違っているか、数値が要件を満たしていません!
falseを返します。
}
//チェックビットは、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 = new Date('19 ' + arrsplit [2] +'/' + arrsplit [3] +'/' + arrsplit [4]);
var bgoodday;
bgoodday =(dtmbirth.getyear()== number(arrsplit [2]))))) (arrsplit [4]));
if(!bgoodday)
{
// alert( '入力されたID番号の生年月日は間違っています!');
falseを返します。
}
それ以外
{
// 15桁のIDカードを18桁に変換します
//チェックビットは、ISO 7064:1983.mod 11-2の規定に従って生成され、Xは10番と見なすことができます。
var arrint = new Array(7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2);
var arrch = new Array( '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];
trueを返します。
}
}
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 = new Date(arrsplit [2] + "/" + arrsplit [3] + "/" + arrsplit [4]);
var bgoodday;
bgoodday =(dtmbirth.getFullyear()== number(arrsplit [2])))) arrsplit [4]));
if(!bgoodday)
{
// alert(dtmbirth.getyear());
// alert(arrsplit [2]);
// alert( '入力されたID番号の生年月日は間違っています!');
falseを返します。
}
それ以外
{
// 18桁のIDカードの検証コードが正しいかどうかを確認します。
//チェックビットは、ISO 7064:1983.mod 11-2の規定に従って生成され、Xは10番と見なすことができます。
Var Valnum;
var arrint = new Array(7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2);
var arrch = new Array( '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カードの検証コードは間違っています!
falseを返します。
}
trueを返します。
}
}
falseを返します。
}