使用javascript验证UNC路径

时间:2011-06-14 14:15:03

标签: javascript string validation path

如何使用javascript验证UNC路径?

有效的UNC路径示例如下: -

\\192.168.0.100\MuhammedRaufK\Share

\\Shared1_svr\Shared1\WGroups\Network\Orders.xls

3 个答案:

答案 0 :(得分:2)

这是一个老问题,但我最近需要答案。关于此Stack Overflow问题(Regex to validate a network path it PHP, jQuery, JavaScript, Ruby)有一些建议,但是大多数问题都没有说明UNC路径中允许的许多变化。进一步的研究使我在channel9上找到了这个主题:

https://channel9.msdn.com/Forums/TechOff/132283-regex-UNC-share

它表明(记录良好)RegEx of

^(\\\\[^/\\\]\[":;|<>+=,?* _]+\\[^/\\\]\[":;|<>+=,?*]+)((?:\\[^\\/:*?"<>|]+)*\\?)$

似乎运作良好,至少对我的需求而言。

答案 1 :(得分:2)

使用MSDN作为参考,这里是一个正则表达式,用于捕获UNC路径的各个部分:

/^\\\\([^\\:\|\[\]\/";<>+=,?* _]+)\\([\u0020-\u0021\u0023-\u0029\u002D-\u002E\u0030-\u0039\u0040-\u005A\u005E-\u007B\u007E-\u00FF]{1,80})(((?:\\[\u0020-\u0021\u0023-\u0029\u002D-\u002E\u0030-\u0039\u0040-\u005A\u005E-\u007B\u007E-\u00FF]{1,255})+?|)(?:\\((?:[\u0020-\u0021\u0023-\u0029\u002B-\u002E\u0030-\u0039\u003B\u003D\u0040-\u005B\u005D-\u007B]{1,255}){1}(?:\:(?=[\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]|\:)(?:([\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]+(?!\:)|[\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]*)(?:\:([\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]+)|))|)))|)$/

分解如下:

/^\\\\ - 匹配以两个反斜杠\\\\

开头的字符串

() - capture(1)(主机名)

[^\\:\|\[\]\/";<>+=,?* _]+ - 匹配任何字符序列,不包括\\:\|\[\]\/";<>+=,?* _,一次或多次

\\ - 匹配文字反斜杠\\

() - 捕获(2)(共享名称)

[\u0020-\u0021\u0023-\u0029\u002D-\u002E\u0030-\u0039\u0040-\u005A\u005E-\u007B\u007E-\u00FF]{1,80} - 匹配匹配!#$%'()\-\.0-9@A-Z^_`a-z{}~和Latin-1 Unicode补充的1到80个字符的任何序列

( - 开始捕获(3)(对象名称)

( - 开始捕获(4)(路径名)

(?:\\[\u0020-\u0021\u0023-\u0029\u002D-\u002E\u0030-\u0039\u0040-\u005A\u005E-\u007B\u007E-\u00FF]{1,255})+? - 捕获但不记得\\字面值后跟一个或多个匹配!#$%'()\-\.0-9@A-Z^_`a-z{}~和Latin-1 Unicode补丁的1到255个字符的序列,并且非贪婪地执行此操作(5)

|) - 或者什么都不捕获(4)(路径名)

(?: - 开始捕捉但不记得(6)

\\ - 匹配\\字面

( - 开始捕获(7)(文件名)

(?:[0-9a-z]{1,255}){1} - 捕获但不记得与!#$%'()\+,\-\.0-9;=@A-Z\[\]^_`a-z{匹配的1到255个字符的序列(8)

(?: - 开始捕捉但不记得(9)

\:(?=[\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]|\:) - 仅当后跟:或文字\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF

时才匹配文字:

(?: - 开始捕捉但不记得(10)

([\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]+(?!\:)|[\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]*) - 捕获一个或多个字符的序列,后面跟着文字:;否则,捕获0个或更多字符的序列(11)(流名称)

(?: - 开始捕捉但不记得(12)

\: - 匹配文字:

([\u0001-\u002E\u0030-\u0039\u003B-\u005B\u005D-\u00FF]+) - 捕获一个或多个字符的序列(13)(流类型)

|) - 或者什么都不捕获(12)

) - 结束捕获(10)

|) - 或者什么都不捕获(9)

) - 结束捕获(7)(文件名)

) - 结束捕获(6)

|) - 或者什么都不捕获(3)(对象名称)

$/ - 字符串结尾

一些注意事项:

  1. 正则表达式匹配整个字符串。
  2. 主机名和共享名称必需,以使此正则表达式匹配。
  3. 主机名称匹配严格(通过4个RFC指定:3986103511234291)。因此,可能会出现一些误报。如果需要严格验证主机名,请捕获主机名并独立于此正则表达式进行测试。
  4. 尾随\\ 从不允许。
  5. 对于JavaScript库实现,包括测试和示例,请参阅here

答案 2 :(得分:0)

如果通过“验证”表示“确保其格式正确”,那么肯定。 UNC路径足够常规,可由regular expression定义。

如果您的意思是测试路径是否引用了有效的目录或文件,那将取决于运行JavaScript的主机环境的功能。例如,您无法在大多数浏览器中轻松完成此操作,但您可以使用NodeJSRhinoWindows Script Host