【问题标题】:Validating file types by regular expression通过正则表达式验证文件类型
【发布时间】:2010-09-27 08:35:51
【问题描述】:

我有一个 .NET 网络表单,它有一个与正则表达式验证器相关联的文件上传控件。此验证器需要验证只允许上传某些文件类型(jpg、gif、doc、pdf)

执行此操作的当前正则表达式是:

^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF|.doc|.DOC|.pdf|.PDF)$

但是这似乎不起作用...谁能给我一点 reg ex 帮助?

【问题讨论】:

  • 我相信你知道这一点,但是,如果有人后来发现了这个问题而没有:这个方法只会验证文件的扩展名,而不是它的实际类型。收到文件后,您必须检查其内容以确定其内容。如果您依赖名称,这是一个巨大的安全漏洞。
  • $ 很重要,否则你很容易被那些只是继续的文件名所吸引(即AnnaKournikova.jpg.vbs,请参阅Anna Kournikova (computer virus)

标签: c# asp.net .net regex


【解决方案1】:

在我看来,您的正则表达式似乎有点过于复杂。另外,请记住点是一个特殊字符,意思是“任何字符”。以下正则表达式应该可以工作(注意转义点):

^.*\.(jpg|JPG|gif|GIF|doc|DOC|pdf|PDF)$

您可以使用Expresso 之类的工具来测试您的正则表达式。

【讨论】:

  • 在 .NET 中做正则表达式时,不需要枚举大小写差异。它不仅会降低可读性,而且如果在循环中调用它也会降低性能。
  • 问题是正则表达式用于RegularExpressionValidator ASP.NET控件,AFAIK不接受IgnoreCase等选项。
  • 我在原始帖子中错过了这一点。是的,RegularExpressionValidator 区分大小写选项是微软几年来一直无视整个社区的请求。
  • 您可以省略 ^.*,因为“从头到尾匹配任何内容”与“在结尾匹配此表达式”相同。您还可以嵌入正则表达式选项msdn.microsoft.com/en-us/library/yd1hzczs.aspx
  • 为了嵌入正则表达式选项以忽略大小写,您需要禁用客户端脚本(我认为 JavaScript 不支持它)。然后,您可以使用 "(?i:.(jpg|gif|doc|pdf))$" 进行不区分大小写的匹配。
【解决方案2】:
^.+\.(?:(?:[dD][oO][cC][xX]?)|(?:[pP][dD][fF]))$

将接受文件名至少为一个字符的 .doc、.docx、.pdf 文件:

^           = beginning of string
.+          = at least one character (any character)
\.          = dot ('.')
(?:pattern) = match the pattern without storing the match)
[dD]        = any character in the set ('d' or 'D')
[xX]?       = any character in the set or none 
              ('x' may be missing so 'doc' or 'docx' are both accepted)
|           = either the previous or the next pattern
$           = end of matched string

警告!如果不将整个扩展链包含在 (?:) 中,像 .docpdf 这样的扩展就会通过。

您可以在http://www.regextester.com/ 测试正则表达式

【讨论】:

    【解决方案3】:

    您是否只是想验证文件是否具有给定的扩展名?您可以通过以下方式简化您尝试执行的操作:

    (.*?)\.(jpg|gif|doc|pdf)$
    

    然后,当您调用 IsMatch() 时,请确保传递 RegexOptions.IgnoreCase 作为您的第二个参数。没有理由必须列出套管的变体。

    编辑:正如 Dario 提到的,这不适用于 RegularExpressionValidator,因为它不支持大小写选项。

    【讨论】:

    • 这个允许在文件名中包含点,这对我来说很好
    【解决方案4】:

    您可以像这样在正则表达式中嵌入不区分大小写:

    \.(?i:)(?:jpg|gif|doc|pdf)$
    

    【讨论】:

    • 除非启用客户端脚本选项会失败。
    • Afaik javascript 确实允许内联选项,但它适用于整个正则表达式,而不仅仅是它之后的所有内容,在这种情况下并不重要。除非有其他原因它不起作用(我无法测试 atm)。
    • 不,JS 根本不支持内联修饰符。此外,即使在 .NET 中,您的正则表达式也无法使用;你想要“\.(?i)(?:jpg|gif|doc|pdf)$”或“\.(?i:jpg|gif|doc|pdf)$”。 This: "(?i:)" 不匹配任何内容,不区分大小写。
    【解决方案5】:

    您可以将此模板用于每种文件类型:

    ValidationExpression="^.+\.(([pP][dD][fF])|([jJ][pP][gG])|([pP][nN][gG])))$"
    

    例如:您可以为 Rar 文件类型等添加 ([rR][aA][rR]) ...

    【讨论】:

      【解决方案6】:

      您的正则表达式似乎同时验证了文件名和扩展名。那是你需要的吗?我假设它只是扩展并且会使用这样的正则表达式:

      \.(jpg|gif|doc|pdf)$
      

      并将匹配设置为不区分大小写。

      【讨论】:

        猜你喜欢
        • 2012-01-08
        • 2015-04-20
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 2011-07-01
        • 2012-10-05
        相关资源
        最近更新 更多