【问题标题】:validation of UNC path using javascript使用 javascript 验证 UNC 路径
【发布时间】:2011-09-14 18:06:21
【问题描述】:

如何使用 javascript 验证 UNC 路径?

有效 UNC 路径的示例是:-

\\192.168.0.100\MuhammedRaufK\Share

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

【问题讨论】:

  • 验证是什么意思?您是否要实际检查文件/目录是否存在?服务器端 JS 还是客户端(浏览器)端?如果是后者,哪个浏览器?

标签: javascript string validation path


【解决方案1】:

如果“验证”是指“确保其格式正确”,当然可以。 UNC 路径足够规则,可以由 regular expression 定义。

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

【讨论】:

  • 什么,没有RFC link 包含正则表达式?
  • @Matt:我一定觉得很懒惰。 :)
  • @Muhammed:你的意思是,给你写?这可能至少需要一个小时的写作、测试等工作;我没有资格为你做这件事。相反,您最好使用 @Matt 提供给语法定义的链接并深入研究 JavaScript 的正则表达式语法,自己制作。
【解决方案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

它暗示了一个(有据可查的)正则表达式

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

这似乎运作良好,至少满足我的需要。

【讨论】:

    【解决方案3】:

    使用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]+)|))|)))|)$/
    

    细分如下:

    /^\\\\ - 匹配以两个反斜杠开头的字符串\\\\

    () - 捕获 (1)(主机名)

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

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

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

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

    ( - 开始捕获 (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. 绝不允许使用尾随 \\

    有关 JavaScript 库实现,包括测试和示例,请参阅 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 2013-02-27
      相关资源
      最近更新 更多