【问题标题】:Problem validating asp:UploadFile file names with RegularExpressionValidator使用 RegularExpressionValidator 验证 asp:UploadFile 文件名时出现问题
【发布时间】:2010-11-14 19:24:37
【问题描述】:

我在设置文件中有一行我想要允许的所有文件类型:

jpeg|jpg|tiff|tif|png|gif|bmp|eps|wmf|emf|pdf|doc|docx|zip|rar|ppt|pptx|mdb|xls

我想在 FileUpload 控件旁边有一个 RegularExpressionValidator,它只允许这些文件。

我在设置正则表达式验证器的 ValidationExpression 属性的 PageLoad 事件中处理它。

我试过了:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string regex = "jpeg|jpg|tiff"; //A huge list of filetypes.
        upFiles_RegularExpressionValidator.ValidationExpression = 
            @"^.*\.(" + regex +")$";
    }
}

但它区分大小写。 我现在唯一的问题是让它变得麻木不仁。

【问题讨论】:

    标签: asp.net regex file-upload case-insensitive file-type


    【解决方案1】:
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string regex = "([jJ][pP][eE][gG])|([jJ][pP][gG])|([tT][iI][fF][fF])"; //A huge list of filetypes.
            upFiles_RegularExpressionValidator.ValidationExpression = 
                @"^.*\.(" + regex +")$";
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您关闭客户端验证并仅使用服务器端验证,则可以使用 .NET 支持不区分大小写的运算符 (?i)。如果您想要在客户端和服务器端都可以使用的东西,您可能需要求助于类似

      [Jj][Pp][Ee][Gg]

      为您的每个文件扩展名。没有包含每个扩展的代码,应该很容易推断出模式

      【讨论】:

      • 你能解释一下这两个选项的区别吗?
      • 不区分大小写的运算符 - (i?) 是特定于 .NET 的运算符,不是标准正则表达式语法的一部分。客户端验证器使用 JavaScipt,因此该运算符在客户端不起作用。如果您可以只使用服务器端验证,则禁用客户端验证并使用运算符。第二个选项等效于说,对于每个扩展 Capitor 或小写 j 后跟 capitol 或小写 p 后跟 capitol 或小写 e 后跟 capitol 或小写 g,方括号 [] 定义一个字符集。
      • .operator中没有JS case吗?我不打算使用 [Jj] 等。
      • yes - /i - 但由于语法与 .NET 等效项不同,您需要为验证器控件选择客户端或服务器端验证。如果两者都需要,那么您可能需要使用自定义验证器。
      【解决方案3】:

      答案:

      ^.*\.(?i-s:pdf|exe)$
      

      这意味着:

      ValidationExpression = @"^.*\.(?i-s:pdf|exe)$"; //will match pdf PDF exe EXE
      
      string regex = "jpeg|jpg|tiff|tif|png|gif|bmp|eps";
      ValidationExpression = @"^.*\.(?i-s:file_types)$".Replace("file_types", regex);
      

      这应该是根据动态可变列表验证文件的一种非常有效的方法

      仅供参考,我是使用 this 在线正则表达式生成器制作的,这是一款了不起的免费工具!

      【讨论】:

      • 哎哟!我刚刚测试了它,它没有!
      • 哎哟!!它是有效的正则表达式,但在 asp:RegularExpressionValidator 中不起作用!有没有办法让这个控制大小写的正则表达式不敏感?
      【解决方案4】:

      正则表达式可以与服务器端的 RegularExpressionValidator 一起正常工作。当它尝试进行客户端验证时,问题就出现了,因为 javascript regex 风格不知道如何处理“?i”(在带有“i”的 javascript regex 中实现了不区分大小写),所以失败了。您可以通过将此脚本添加到您的页面来解决此问题。我认为脚本非常简单。

         <script type="text/javascript" language="javascript"> 
              function RegularExpressionValidatorEvaluateIsValid(val) 
              { 
                var value = ValidatorGetValue(val.controltovalidate); 
                if (ValidatorTrim(value).length == 0) 
                  return true; 
      
                var regex = null; 
                if(val.validationexpression.indexOf("(?i)")>=0) 
                { 
                   regex = new RegExp(val.validationexpression.replace("(?i)",""),"i"); 
                } 
                else 
                { 
                   regex = new RegExp(val.validationexpression); 
                } 
      
                var matches = regex.exec(value);
      
                return (matches != null && value == matches[0]); 
              } 
         </script>
      

      【讨论】:

        【解决方案5】:

        如果您使用 .NET 在服务器端进行此验证,则可以使用类似

        VB:

            Dim re As New Regex("(jpg)|(gif)", RegexOptions.IgnoreCase)
            re.IsMatch("image.jpg")
        

        C#:

            var re = new Regex("(jpg)|(gif)", RegexOptions.IgnoreCase);
            re.IsMatch("image.jpg")
        

        【讨论】:

        • 我正在寻找一种使用 ASP.NET RegularExpressionValidator 控件进行验证的方法。
        猜你喜欢
        • 2010-10-30
        • 2016-06-04
        • 1970-01-01
        • 2016-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多