проверка пути UNC с помощью javascript

Как я могу проверить путь UNC с помощью javascript?

Примеры допустимого пути UNC: -

\\192.168.0.100\MuhammedRaufK\Share

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

person mmk_open    schedule 14.06.2011    source источник
comment
Что вы подразумеваете под подтверждением? Вы действительно хотите проверить, существует ли файл/каталог? JS на стороне сервера или на стороне клиента (браузера)? Если второе, то какие браузеры?   -  person Matt Ball    schedule 14.06.2011


Ответы (3)


Это старый вопрос, но мне нужен был ответ на него недавно. Есть несколько предложений по этому вопросу о переполнении стека (Regex для проверки сетевого пути в PHP, jQuery, JavaScript, Ruby), но большинство из них не учитывают многие из допустимых вариантов путей UNC. Дальнейшие исследования привели меня к этой теме на канале 9:

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

Он предлагает (хорошо задокументированный) RegEx из

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

который, кажется, работает хорошо, по крайней мере, для моих нужд.

person DrBoom    schedule 14.08.2015

Используя 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) (имя хоста)

[^\\:\|\[\]\/";<>+=,?* _]+ - соответствует любой последовательности символов, кроме \\:\|\[\]\/";<>+=,?* _, один или несколько раз

\\ - соответствует буквальной обратной косой черте \\

() - захватить (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})+? - захватывать, но не запоминать литерал \\, за которым следует одна или несколько последовательностей от 1 до 255 символов, соответствующих !#$%'()\-\.0-9@A-Z^_`a-z{}~ и дополнению Unicode Latin-1, и делать это не жадно (5)

|) - ИЛИ ничего не захватывать (4) (путь)

(?: - начать захват но не помнить (6)

\\ — соответствует литералу \\

( - начать захват (7) (имя файла)

(?:[0-9a-z]{1,255}){1} - захватить, но не запомнить последовательность от 1 до 255 символов, совпадающую с !#$%'()\+,\-\.0-9;=@A-Z\[\]^_`a-z{ (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: 3986, 1035, 1123 и 4291). Следовательно, могут возникать некоторые ложные срабатывания. Если имя хоста необходимо тщательно проверить, зафиксируйте имя хоста и протестируйте его независимо от этого регулярного выражения.
  4. Конечный \\ никогда не допускается.

Реализацию библиотеки JavaScript, включая тесты и примеры, см. в разделе здесь.

person kgryte    schedule 05.10.2016

Если под «проверкой» вы подразумеваете «убедитесь, что это в правильном формате», конечно. Пути UNC достаточно регулярны, чтобы их можно было определить с помощью регулярного выражения.

Если вы имеете в виду, что и проверка того, ссылается ли путь на действительный каталог или файл, это будет зависеть от возможностей хост-среды, в которой выполняется JavaScript. Например, вы не можете легко сделать это из большинства браузеров, но можете с помощью NodeJS или Rhino или Узел сценариев Windows.

person T.J. Crowder    schedule 14.06.2011
comment
Что, нет RFC-ссылки, содержащей регулярное выражение? - person Matt Ball; 14.06.2011
comment
@Matt: Я, должно быть, очень ленив. :) - person T.J. Crowder; 14.06.2011
comment
@Muhammed: Ты имеешь в виду, написать это для тебя? Это, вероятно, по крайней мере час работы по написанию, тестированию и т. д.; Я не в состоянии сделать это за вас. Вместо этого вам лучше использовать ссылку, которую @Matt любезно предоставил для определений синтаксиса, и углубиться в синтаксис регулярных выражений JavaScript, создав его самостоятельно. - person T.J. Crowder; 14.06.2011