2010/07/28

[ASP.Net] 利用 RegularExpressionValidator 排除特定字串

在常被用來檢查欄位的驗證控制項中, RegularExpressionValidator 算是最常被用到的.
不過還是不要為了用 RegularExpressionValidator 而用, 以免為了兜出想要的 ValidationExpression 而傷透腦筋. 舉例來說, 設計一個只允許數字的輸入欄, 我們可以用以下兩種做法:

  1. 使用 RegularExpressionValidator, 並設定適合的 ValidationExpression 屬性.
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" 
      runat="server" ErrorMessage="只允許數字" ValidationExpression="^[\d]+$" 
      ControlToValidate="TextBox1" Display="Dynamic">
    </asp:RegularExpressionValidator>
  2. 使用 CompareValidator, 並設定 Operator="DataTypeCheck", 來做輸入欄位的型態檢查.
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:CompareValidator ID="CompareValidator1" runat="server" 
      ErrorMessage="只允許數字" Operator="DataTypeCheck" 
      ControlToValidate="TextBox1" Type="Integer" Display="Dynamic">
    </asp:CompareValidator>
以上兩種方式都可達到僅可輸入數字的目的, 不過這會連 001 這樣的值都可通過.
這時候 RegularExpressionValidator 就顯得比較有利, 只要修改一下 ValidationExpression="^([1-9][\d]*)|(0)$", 就可以排除掉第一位數為 0 的輸入值.
不過, 若將上面的例子修改一下, 只允許數字, 但要排除掉 999 這個值.
這時候 CompareValidator 又顯得比較方便了, 參考如下:
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server" 
  ErrorMessage="只允許數字(除了999)" ControlToValidate="TextBox1" 
  Type="Integer" Operator="NotEqual" ValueToCompare="999" Display="Dynamic">
</asp:CompareValidator>
用 RegularExpressionValidator 就有點麻煩了, 要利用到 (?!).
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" 
  runat="server" ErrorMessage="只允許數字(除了999)"
  ValidationExpression="^(?!^999$)([1-9][\d]*)|(0)$" 
  ControlToValidate="TextBox1" Display="Dynamic">
</asp:RegularExpressionValidator>
接下來, 假設有一種情境, 是在申請帳號的地方, 我們不希望使用者輸入 admin 或 guest.
若用 CompareValidator 就沒辦法了, 因為要判斷的是兩個字串.
不過我們可以藉由修改上述的 RegularExpressionValidator, 來達到這樣的目的.
其中, 我僅限制使用者輸入小寫的 a-z, 以及數字 0-9, 且第一字元不可是數字.
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" 
  runat="server" ErrorMessage="輸入錯誤(不允許admin/guest)"
  ValidationExpression="^(?!^((admin)|(guest))$)[a-z][a-z0-9]+$" 
  ControlToValidate="TextBox1" Display="Dynamic">
</asp:RegularExpressionValidator>
結論:
透過 (?!) 或 (?=), 我們可以判斷使用者輸入的資料是否為我們要的, 進而接受或排除掉. 
不過, 可惜的是 (?i) 這個不區分大小寫的用法, 在 Javascript 中不支援.
所以若要在 RegularExpressionValidator 中, 設定不區分大小寫, 需要將 EnableClientScript 設定成 false, 然後在 Server 端去判斷.
參考如下:
.aspx檔:
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" 
  ControlToValidate="TextBox1"
  runat="server" ErrorMessage="輸入錯誤(不允許admin/guest)" 
  Display="Dynamic" 
  ValidationExpression="^(?!(?i)^((admin)|(guest))$)[a-zA-Z][a-zA-Z0-9]+$" 
  EnableClientScript="False">
</asp:RegularExpressionValidator>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
.cs檔:
protected void Button1_Click(object sender, EventArgs e)
{
    if(this.RegularExpressionValidator1.IsValid)
    {
        //...
    }
}

沒有留言: