валидиране на 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 пътищата. Допълнително проучване ме доведе до тази тема на channel9:

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{}~ и Latin-1 Unicode допълнение и направете това без алчност (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 връзка, съдържаща regexp? - 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