【问题标题】:ASP.net MVC regular expression in view model for filename validation用于文件名验证的视图模型中的 ASP.net MVC 正则表达式
【发布时间】:2013-05-02 17:47:49
【问题描述】:

我已经阅读了一些回答这个问题的问题,并且我了解我需要使用的正则表达式,但是在 MVC 中实际应用它是我绊倒的地方。我还会先说我目前不擅长正则表达式。

我正在 MVC 中编写一个文件上传应用程序,并且我想应用标准的 Windows 文件名验证。 \/:*?"<>| 是名称中任何位置的无效字符。

我的视图模型是这样设置的,使用我发现的不同正则表达式:

    public class FileRenameModel
{
    [RegularExpression(@"^[\w\-. ]+$", ErrorMessage="A filename cannot contain \\ / : * ? \" < > |")]
    [Required]
    public string Filename { get; set; }
    [Required]
    public int FileID      { get; set; }
}

每当我尝试将正则表达式更改为@"^[\\/:?"&lt;&gt;|]+$ 时,中间的 " 都会杀死它并引发错误。我还没有弄清楚如何正确地转义它以便可以将它包含在字符串中。当我使用没有 " 的正则表达式告诉我我放入文本框中的任何字符串都失败了。我是否错误地使用了^

【问题讨论】:

    标签: asp.net-mvc regex


    【解决方案1】:

    在以@ 开头的字符串后使用双"" 转义引号。

    要搜索任何内容,除了您想在括号内插入一个额外的^ 以创建一个例外匹配:@"^[^\\/:?""&lt;&gt;|]+$"^ 保留在开头以及匹配行的开头。

    话虽如此,请记住浏览器以不同方式处理文件名的验证。一些较旧的浏览器会随文件名一起发送路径,这可能会破坏您对合法文件的验证。

    【讨论】:

    • 这部分帮助了我“,谢谢。但不幸的是,我仍然卡在逻辑上。
    • 谢谢保罗。我最终在检查您的评论之前尝试了这个并且它有效,但现在我解释了为什么要这样做。我将不得不检查我的验证是否破坏了合法文件名。
    • 是的,通常这会起作用,但就像我说的,有些浏览器要么发送实际路径,要么在前面加上一些奇怪的东西,比如://。如果可以的话,最好通过删除System.IO.Path.GetInvalidPathChars() 返回的任何字符来清理请求处理程序中的文件名。
    • 我完全意识到我实际上已经实施了卫生。今天早上的咖啡不够。再次感谢,这对我来说是一次很好的学习经历。
    【解决方案2】:

    这个正则表达式应该匹配足够多的有效 NTFS 文件名子集(请记住,NTFS 文件名可能包含几乎 any Unicode 字符。)

    Regex rxValidFileName = new Regex(@"^[[\p{IsBasicLatin}\p{IsLatin-1Supplement}\p{IsLatinExtended-A}\p{IsLatinExtended-B}]-[\p{C}<>:""/\|?*]]+$" , RegexOptions.IgnorePatternWhitespace|RegexOptions.IgnoreCase);
    

    这匹配什么:

    • 行首,后跟
    • 1 个或多个
      • 任何基本拉丁语、latin-1 补充或拉丁语扩展 A 或 -B 字符,除非...
      • 除非它是 C0 或 C1 控制字符或 NTFS 不允许的字符之一 — &lt;&gt;:"/\|?*
    • 由行尾终止。

    请注意,这匹配文件名,而不是文件路径。文件路径更复杂,因为它有一个语法,就像这样,在粗略的 ABNF 中:

    filepath : relative-path
             | absolute-path
             | drivespecifier (relative-path|absolute-path)?
             | unc-share (absolute-path)?
             ;
    
    relative-path : filename ( directory-separator filename? )*
    
    absolute-path : directory-separator ( filename? directory-separator )*
    
    directory-separator : [/\]
    
    drivespecifier : [a-zA-Z] ":"
    
    unc-share : "\\" filename "\" filename absolute-path?
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2012-01-04
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多