私たちがインターネットのウェブサイトを構築するとき、個人情報を登録するときによくID番号を使用します。そうでないと、他の人は番号を入力してパスするだけで、このウェブサイトが非常に優れていると感じます。くそー。
ID番号にはルールがあります。
構造と形状
1.数値構造
国民識別番号は、17 桁のボディ コードと 1 桁のチェック コードで構成される特徴的な組み合わせコードです。左から右へ、6 桁の住所コード、8 桁の生年月日コード、3 桁のシーケンス コード、1 桁のチェック コードの順です。
2.住所コード
コーディング オブジェクトの永住地が所在する郡 (市、旗、地区) の行政区画コードを示し、GB/T2260 の規定に従って実装されます。
3.生年月日コード
エンコードオブジェクトの誕生年、月、日を示します。GB/T7408 の規定に従って実装されます。年、月、日のコードの間に区切り文字はありません。
4.シーケンスコード
同じ住所コードで特定される地域内で同じ年、月、日に生まれた人に割り当てられる順序番号を表し、順序コードの奇数が男性、偶数が女性に割り当てられます。
5.確認コード
前の 17 桁のコードに基づいて、チェック コードは ISO 7064:1983.MOD 11-2 チェック コードに従って計算されます。
計算方法
1. ID 番号の前の 17 桁にさまざまな係数を掛けます。 1 位から 17 位までの係数は、7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2 です。
2. これらの 17 桁の数値と係数を乗算した結果を加算します。
3. 加算した合計を 11 で割ります。余りは何ですか?
4. 残りは 0-1-2-3-4-5-6-7-8-9-10 の 11 桁の数字のみです。対応する最後の ID 番号は 1-0-X-9-8-7-6-5-4-3-2 です。
5. 上記より、余りが 3 の場合、ID カードの 18 桁目は 9 になることがわかります。対応する番号が 2 の場合、ID カードの最後の番号はローマ数字の x になります。
例: 男性の ID カード番号は [53010219200508011x] です。この ID カードが合法的な ID カードであるかどうかを確認してみましょう。
まず、最初の 17 桁の積の合計を取得します [(5*7) (3*9) (0*10) (1*5) (0*8) (2*4) (1*2) (9*1) (2*6) (0*3) (0*7) (5*9) (0*10) (8*5) (0*8) (1*4) (1*2) ] は 189 なので、189 を 11 で割ると、結果は 189/11=17----2 となり、余りは 2 になります。最後に、対応するルールを通じて、剰余 2 に対応するチェック コードが X であることがわかります。したがって、これは正しいID番号であると判断できる。
上記は百度百科事典から引用しました。
これはインターネット上で見つかった関連情報の画像です。
既知の情報によると、このメソッドの内部実装は js で記述できます。最初の 17 桁の検証は実装が比較的簡単なので、詳細には触れず、チェック コードの最後の桁に焦点を当てます。
// ID番号の確認
function isIdCard(cardid) {
// IDカードの正規表現(18ビット)
var isIdCard2 = /^[1-9]d{5}(19d{2}|[2-9]d{3})((0d)|(1[0-2]))(([0|1] |2]d)|3[0-1])(d{4}|d{3}X)$/i;
var stard = "10X98765432" //最後の ID 番号
;
var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17 係数
;
var sum = 0;
If (!isIdCard2.test(cardid)) {
return false;
}
var year = Cardid.substr(6, 4);
var month = Cardid.substr(10, 2);
var day = Cardid.substr(12, 2);
var 誕生日 = Cardid.substr(6, 8);
If (birthday != dateToString(new Date(year '/' month '/' day))) { //日付が有効かどうかを検証します
return false;
}
for (var i = 0; i
sum = Cardid[i] * first[i];
}
var result = sum % 11;
var last = stard[result] //計算された最後の ID 番号
;
If (cardid[cardid.length - 1].toUpperCase() == last) {
true を返します;
} else {
return false;
}
}
//日付を文字列に変換し、日付形式 20080808
を返します
function dateToString(date) {
If (日付インスタンスの日付) {
var year = date.getFull Year();
var month = date.getMonth() 1;
月 = 月
var day = date.getDate();
日 = 日
return 年 月 日;
}
'';
を返します
}
ここでは18桁のIDカードのみが認証され、15桁の第一世代IDカードは使用できません。
日付の正当性もここで検証されます。0230、0431 などの不正な日付の場合、検証は通過しません。
検証を容易にするために、このメソッドを jquery validate に追加することもできます。
カスタム jquery validate 検証メソッドを作成します
// ID番号の確認
jQuery.validator.addMethod("isIdCard",
関数(値, 要素) {
this.optional(element) を返します || (isIdCard(value));
}、
"ID 番号が不正です!");
簡単なデモを見て、それがどのように機能するかを見てみましょう。
<頭>
<タイトル>
身份证号校验
<スクリプトタイプ="text/javascript">
$(関数() {
$("#form1").validate({
ルール: {
txtIdCard: "isIdCard"
}
});
});
// 身份证号验证
function isIdCard(cardid) {
//身份证正则表达式(18位)
var isIdCard2 = /^[1-9]d{5}(19d{2}|[2-9]d{3})((0d)|(1[0-2]))(([0|1] |2]d)|3[0-1])(d{4}|d{3}X)$/i;
var stard = "10X98765432"; //最後一位身份证的号
var first = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //1-17系数
var sum = 0;
if (!isIdCard2.test(cardid)) {
false を返します;
}
var year = Cardid.substr(6, 4);
var month = Cardid.substr(10, 2);
var day = Cardid.substr(12, 2);
var 誕生日 = Cardid.substr(6, 8);
if (birthday != dateToString(new Date(year '/' month '/' day))) {//校验日期是否合法
false を返します;
}
for (var i = 0; i
sum = Cardid[i] * first[i];
}
var result = sum % 11;
var last = stard[result] //最後に計算された ID 番号
;
If (cardid[cardid.length - 1].toUpperCase() == last) {
return true;
} else {
return false;
}
}
//日付を文字列に変換し、日付形式を返します 20080808
function dateToString(date) {
if (日付インスタンス) {
var year = date.getFull Year();
var month = date.getMonth() 1;
月 = 月
var day = date.getDate();
日 = 日
年月日を返します;
}
return '';
}
// jquery validate ID 番号の検証
jQuery.validator.addMethod("isIdCard",
関数 (値, 要素) {
return this.optional(element) || (isIdCard(value));
},
"ID 番号が不正です!");