[作品] 中華民國身份證字號驗證程式 – 使用 jQuery.Validate

最近在研究 jQuery.Validate,這是可以讓你做出「表單還沒送出前就先驗證資料是否正確」效果的 Plug-in,如果網站的 JavaScript 已經採用 jQuery 當作 Library 的話,那麼直接導入 jQuery.Validate 是比較容易的。類似的 Library 如 LiveValidation

示範網頁在這裡;因為 WordPress 不讓我放 Embedded Javascript,所以就到另一個網頁看吧。

做法很簡單:先導入 jQuery.Validate,然後針對要輸入身份證字號的地方,撰寫兩個自定的 Validate 條件,一個是檢驗它是否符合 /^[A-Z]{1}[1-2]{1}[0-9]{8}$/ 的 Regular Expression,另一個是透過算數方式檢查它是否符合邏輯。

首先導入 jQuery 及 jQuery.Validate,這個應該不用多說:

  <script type="text/javascript" src="/path/to/jquery.js"></script>
  <script type="text/javascript" src="/path/to/jquery.validate.js"></script>

以下是一個範例的表單,表單的 id 不能省略,inputid 也不能省略:

  <form id="citizenid_validation" action="some_action.php" method="get">
    <input type="text" name="citizenid" value="" id="citizenid">
  </form>

接著在 JavaScript 裡定義兩個驗證方案,一個是驗證它是否符合/^[A-Z]{1}[1-2]{1}[0-9]{8}$/ 的 Regular Expression:

  $(document).ready (function () {
    /* user_citizenid regex method */

    jQuery.validator.addMethod("ROC_Citizen_ID_regex",

      function(citizenid, element) {
        citizenid = citizenid.replace(/\s+/g, "");

        return (
            this.optional(element) ||
            /^[A-Z]{1}[1-2]{1}[0-9]{8}$/.test(citizenid)
          );
      }, "格式有誤"
    );
  });

另一個是以算數方式檢驗:

  $(document).ready (function () {
    jQuery.validator.addMethod("ROC_Citizen_ID_arithmetic",
      function(citizenid, element) {

          var local_table = [10,11,12,13,14,15,16,17,34,18,19,20,21,
                             22,35,23,24,25,26,27,28,29,32,30,31,33];
                         /* A, B, C, D, E, F, G, H, I, J, K, L, M,
                            N, O, P, Q, R, S, T, U, V, W, X, Y, Z */

        var local_digit = local_table[citizenid.charCodeAt(0)-'A'.charCodeAt(0)];

        var checksum = 0;

        checksum += Math.floor(local_digit / 10);
        checksum += (local_digit % 10) * 9;

        /* i: index; p: permission value */
        /* this loop sums from [1] to [8] */
        /* permission value decreases */

        for (var i=1, p=8; i <= 8; i++, p--)
        {
          checksum += parseInt(citizenid.charAt(i)) * p;
        }

        checksum += parseInt(citizenid.charAt(9));    /* add the last number */

        return (
            this.optional(element) || !(checksum % 10)
          );
      }, "似乎偽造"
    );
  });

最後,把 jQuery.Validate 的規則綁定到表單元件 (form element) 就行了:

  $(document).ready(function () {
    $("#citizenid_validation").validate ({
      success: function(label) {
        label.text("正確")
      },
      rules: {
        citizenid: {
          required: true,
          ROC_Citizen_ID_regex: true,
          ROC_Citizen_ID_arithmetic: true
        }
      }
    });
  });

當然這三件事可以放在同一個 $(document).ready( function () {/*裡面*/})

by the way, 事實上「身份證字號產生器」是很好寫的,反正前 9 個字可以隨便寫,透過算數方法就可以算出最後一個數字是多少。不信的話,你把前面 9 個字隨便亂填,第 10 個字從 0 到 9 都試試看,一定有一個是正確的…

警告本文描述內容僅為學術研究用途,使用非本人的身份證字號是犯法的

關於 Chitsaou Yorkxin
From Taiwan, a National Taiwan Normal University undergraduate student major in Computer Science. You may call me Chitsaou :)

9 Responses to [作品] 中華民國身份證字號驗證程式 – 使用 jQuery.Validate

  1. Dylan 說道:

    有bug…
    開頭字母如果是』小寫』的~
    第一個數字填1或2之後~
    後面隨便填只要字數對~所判斷出來的結果都正確~

  2. Chitsaou Yorkxin 說道:

    @Dylan:

    感謝,原來是我在 regex 後面多加了一個 i (ignore case) …囧

    • BB 說道:

      謝謝分享
      小改版主的作品,讓第一個字為小寫a-z也可以正常使用

      (原來)
      (1) /^[A-Z]{1}[1-2]{1}[0-9]{8}$/.test(citizenid)
      (2) citizenid.charCodeAt(0)-’A’

      (修改後)
      (1) /^[A-Z, a-z]{1}[1-2]{1}[0-9]{8}$/.test(citizenid)
      (2) citizenid.toUpperCase().charCodeAt(0)-’A’

      • Chitsaou Yorkxin 說道:

        只要把 ignore case 的選項拿掉就行了

  3. BB 說道:

    疑~ 目前版主的版本本來就已經沒有i了阿??

    目前版主的版本是第一個字只接受大寫的英文
    像是輸入a1233xxxx會判斷為格式錯誤
    一定要輸入A1233xxxx才可以接受

    我的修改的是讓有需要大小寫通吃的時後使用~ ^_^

    Thanks for response

    • Chitsaou Yorkxin 說道:

      一樓跟我說了我才修改成沒有 i 的

      不過我實際測試的結果是 a123456789 可以過

      也許是我命不好吧…= =

  4. BB 說道:

    對,a123456789會過
    不過…..a123456780 – a123456789 可能都會過喔
    變成檢查碼失效了

    原因沒細看,不過應該是citizenid.charCodeAt(0)-’A’ 引起的

    • Chitsaou Yorkxin 說道:

      噢我懂了

      所以你寫的是把它變成 upper case

      XD

  5. ileadu 說道:

    反正前 9 個字可以隨便寫,透過算數方法就可以算出最後一個數字是多少。

    這句有 Bug

    因為第一個數字 只能是 1 或 2

    怎麼可以隨便填呢? 哈哈

發表迴響

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>