通过正则表达式验证文件类型
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)$
并将匹配设置为不区分大小写。
【讨论】:
以上是关于通过正则表达式验证文件类型的主要内容,如果未能解决你的问题,请参考以下文章