通过正则表达式验证文件类型

Posted

技术标签:

【中文标题】通过正则表达式验证文件类型【英文标题】: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)。 【参考方案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)$

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

【讨论】:

以上是关于通过正则表达式验证文件类型的主要内容,如果未能解决你的问题,请参考以下文章

js 正则验证正整数

验证货币类型的正则表达式

输入类型=“数字”时,正则表达式验证是不是有效?

javascript配置扩展名正则表达式并验证

正则表达式验证密码必须由大小写字母、数字、特殊字符组成

字典字段服务器端的 C# 正则表达式验证 - .Net Core MVC