【问题标题】:Regex for file path validation in javascript用于 javascript 中文件路径验证的正则表达式
【发布时间】:2010-01-08 19:52:27
【问题描述】:

我似乎找不到用于测试以下情况的 JavaScript 正则表达式:

  • c:\temp
  • D:\目录名\测试\
  • \john-desktop\tempdir\

你可以看到我的目的。我只需要它来验证文件路径。但似乎我发现的所有表达式都不适用于 JavaScript。

【问题讨论】:

  • 你会如何处理 JS 中的文件路径?通常 JS 没有任何访问本地磁盘文件系统的权限。将文件路径发送到服务器端也没有多大意义,因为服务器无权访问客户端的本地磁盘文件系统。毕竟我认为你只需要input type="file" 而不必担心验证。
  • BalusC,我明白这一点。我正在创建的应用程序正在处理将文件路径作为其字段之一的数据库服务器。为了对其进行编辑,我想进行一些验证。即使用户可能会放入一个无效的路径,至少这将有助于确保用户完全放入一个路径。此外,这是一个服务器端路径,因此输入 type="file" 将不起作用。谢谢。

标签: javascript regex filepath


【解决方案1】:

这是 Windows 路径验证,它适用于所有 Windows 路径规则。

var contPathWin = document.editConf.containerPathWin.value;

if(contPathWin=="" || !windowsPathValidation(contPathWin))
{
    alert("please enter valid path");
    return false;
}

function windowsPathValidation(contwinpath)
{
    if((contwinpath.charAt(0) != "\\" || contwinpath.charAt(1) != "\\") || (contwinpath.charAt(0) != "/" || contwinpath.charAt(1) != "/"))
    {
       if(!contwinpath.charAt(0).match(/^[a-zA-Z]/))  
       {
            return false;
       }
       if(!contwinpath.charAt(1).match(/^[:]/) || !contwinpath.charAt(2).match(/^[\/\\]/))
       {
           return false;
       } 

}

这是用于 linux 路径验证的。

var contPathLinux = document.addSvmEncryption.containerPathLinux.value;

if(contPathLinux=="" || !linuxPathValidation(contPathLinux))
{
    alert("please enter valid path");
    return false;
}

function linuxPathValidation(contPathLinux)
{
    for(var k=0;k<contPathLinux.length;k++){
        if(contPathLinux.charAt(k).match(/^[\\]$/) ){
            return false;
        }
    }
    if(contPathLinux.charAt(0) != "/")
    {
        return false;
    }
    if(contPathLinux.charAt(0) == "/" && contPathLinux.charAt(1) == "/")
    {
        return false;
    }
    return true;
}

尽量做到单一条件。

【讨论】:

  • 此检查将失败,路径包含减号“-”
【解决方案2】:

试试这个:

([a-zA-Z]:)?(\\[a-zA-Z0-9_-]+)+\\?

编辑:

@Bart 让我想到了这个正则表达式。这个应该适用于 windows 的路径。

^([a-zA-Z]:)?(\\[^<>:"/\\|?*]+)+\\?$

【讨论】:

  • 也匹配一个空字符串。另请注意,Windows 中的文件夹可以包含多个 [a-zA-Z0-9_-] 集合。
  • +1 因为当我看到其他人像我一样写正则表达式时,我感觉好多了;毕竟我是“正常人”
  • @Bart 你是对的,谢谢。我会修复它。注意:我知道,但它只是可编辑的。我写了基础正则表达式 - 思路很清晰
  • 我还没有测试过,但是看起来这排除了以数字和其他非字母字符开头的路径?
  • @Joe 为什么要这样?第一组是 Windows 中的驱动器号,例如 C:。在 URI 结构中,您可以将其视为一种方案。正则表达式的其余部分与包括数字和非字母字符的资源路径匹配。只有明确提到的禁止字符。注意:它匹配绝对路径,基于问题
【解决方案3】:

我认为这会奏效:

var reg = new RegExp("^(?>[a-z]:)?(?>\\|/)?([^\\/?%*:|\"<>\r\n]+(?>\\|/)?)+$", "i");

我刚刚排除了文件名中的所有 (?) 无效字符。应该使用国际文件名(我不知道)以及任何操作系统路径类型(除了下面提到的例外)。

【讨论】:

  • 抱歉,您排除的一些字符是允许的,例如% [ ]
  • % 在我链接的wiki页面上定义为一个系统上的通配符,因此,为了兼容性,它是不允许的。不过,我已更新以从禁止列表中删除 []。
  • @Kevin 我正在使用 Linux Ubuntu ( Jaunty ) 并且 % 有允许的字符。所以我可以有一个与你的正则表达式不匹配的文件(我知道,那里的字符的使用很丑,但我们对未来的客户一无所知)
  • 就像我说的,它在每个 wiki 页面上都不是全局有效的,所以我将它添加到规则列表中。如果有问题的字符在您的风险评估中无关紧要,请将其删除:) 请参阅:en.wikipedia.org/wiki/Filename
  • 正则表达式非常棘手,我真的不知道它们是代码的光明面还是黑暗面的技术 :) 我发现 2 件事不起作用:首先,不接受驱动器名称的大写字母(修复起来很简单)。其次,它确实接受像'a:b'这样的路径是非法的,这是因为第二部分的构造与第三部分的可选性有关......我不知道如何解决它......跨度>
【解决方案4】:

我在这里找到了一个例子: http://regexlib.com/Search.aspx?k=file+name&AspxAutoDetectCookieSupport=1 我已经修改它以匹配以'\'开头的路径:

^((([a-zA-Z]:|\\)\\)|(\\))?(((\.)|(\.\.)|([^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?))\\)*[^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?$

这是清晰的正则表达式非转义版本,更易于阅读(真的!)。

它匹配如下路径:

  • c:\temp
  • \临时
  • ..\我的文件夹
  • üöä

等等

【讨论】:

    【解决方案5】:

    你可以从:

    ^([a-zA-Z]:)?(\\[a-zA-Z0-9_\-]+)+\\?
    

    这匹配您的所有样本。

    【讨论】:

      猜你喜欢
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多