【问题标题】:Regular Expression Validator in ASP.NET for \*, \|, \^, \~ASP.NET 中用于 \*、\|、\^、\~ 的正则表达式验证器
【发布时间】:2012-04-20 19:26:19
【问题描述】:

我想确保用户没有输入以下任何字符串:\*\|\^\~

我将在 ASP.Net 页面中为此使用什么正则表达式,并且 ASP.Net 正则表达式验证器是否会使用客户端正则表达式在服务器端自动验证,或者我需要编写服务器端验证代码?

*** 允许

^|*~ 允许

\** 不允许

\^\|*\~ 不允许

【问题讨论】:

    标签: asp.net regex validation negative-lookahead


    【解决方案1】:

    正则表达式通常用于定义主题应匹配的模式。您要求的是定义一个主题不应该匹配的模式。反向匹配不是正则表达式的内置功能,但是可以通过使用negative lookaround 来模仿这种行为。

    以下表达式使用负前瞻 (?!...) 来匹配您需要的内容:

    ^((?!(\\\*)|(\\\|)|(\\\^)|(\\\~)).)*$
    

    This SO answer 很好地解释了负前瞻如何实现逆正则表达式匹配行为。

    我想这也回答了您关于如何转义反斜杠字符的问题。你只是像我上面所做的那样双重逃脱。

    关于 Asp.Net WebForms 中的客户端 + 服务器端验证

    只要您将EnableClientScript 设置为trueRegularExpressionValidator 控件就会为您执行服务器端和客户端验证。这将导致在ControlToValidate 失去焦点(客户端)或回发页面(服务器端)时显示错误消息。

    【讨论】:

    • 在我的情况下,反斜杠不是转义字符。我实际上想确保用户没有输入这两个字符,包括反斜杠和反斜杠后面的字符。
    • @Sunil 啊,好吧,所以你会允许***^|*~ 但不允许*\**\^\|\*\~?即你的意思是文字\*\^等......
    • *** 允许,^|*~ 允许,\** 不允许,\^\|*\~?不允许。是的,我的意思是字面意思。谢谢
    • 好的,所以在这种情况下,您需要使用否定环视。我会更新我的答案。
    • 罗比。非常感谢。出色的答案和帮助。
    【解决方案2】:

    正则表达式的转义是您已经输入的内容:\\*\| 等)。至于使用这个。如果您希望在客户端完成此操作,我会使用 javascript/jquery

    【讨论】:

    • +1,但如果您想要一个非常自定义或不显眼的解决方案,您只需要编写自己的 javascript/jquery。这是因为EnableClientSide 设置为 true,asp.net 会为您将客户端代码插入页面。
    【解决方案3】:

    正则表达式验证器正在客户端验证内容。您可以使用自定义验证器,它可以在客户端和服务器端进行验证。

    自定义验证器示例:

    //html:
    <asp:TextBox ID="textPreferredDate" runat="server"></asp:TextBox>
    <asp:CustomValidator ID="CustomValidator1" runat="server" ControlToValidate="textPreferredDate" Display="Dynamic" ErrorMessage="Format: m/d/yyyy" OnServerValidate="CustomValidator1_ServerValidate" ClientValidationFunction="validateDate">Invalid format (m/d/yyyy)</asp:CustomValidator><br />
    
    //client side:
    <script language="javascript">
    function validateDate(oSrc, args)
    {
       var iDay, iMonth, iYear;
       var arrValues;
       arrValues = args.Value.split("/");
       iMonth = arrValues[0];
       iDay = arrValues[1];
       iYear = arrValues[2];
    
       var testDate = new Date(iYear, iMonth - 1, iDay);
       if ((testDate.getDate() != iDay) ||
          (testDate.getMonth() != iMonth - 1) ||
          (testDate.getFullYear() != iYear))
       {
           args.IsValid = false;
           return;
       }
    
       return true;
    } </script>
    
    //server side:
    protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
    {
       try
       {
          DateTime.ParseExact(args.Value, "d", null);
          args.IsValid = true;
       }
       catch
       {
          args.IsValid = false;
       }
    }
    

    顺便说一句,如果您同时实现客户端和服务器验证,请小心。有关更多信息,请阅读此问题:Form validation client side and server side

    【讨论】:

    • 假设您在代码隐藏中调用“Page.IsValid”进行检查,标准验证器将在客户端和服务器端进行验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多