Показать полную графическую версию : Проверка строки на соответствие правил именования DNS
к тому же, не думаю, что микрософт выпускает софт противоречащий неким стандартам доменных имен. »
«Произвольно расширяющий» или «Слишком широко трактующий» стандарты — легко! Примеров тому тьма: любая корпорация (или конгломерат корпораций), имеющая монопольное или близкое к нему положение на рынке или в своей (полу)закрытой нише, успела отметиться на данном поприще, что IBM, что Microsoft, что Apple, что Google и т.п.
Просто, есть подозрение, что RFC датированный 1987 годом, наверное несколько устарел, »
Вполне возможно, что и появились какие-то расширения его. Я тоже не стал глы́́боко копать в развитие :).
«Произвольно расширяющий» или «Слишком широко трактующий» стандарты — легко! »
Согласен, но только частично. То, что касается их собственных продуктов, они вольны создавать собственные стандарты или даже "соглашения", но что касается доменных имен (а сейчас мы говорим именно о них):
Метод CheckHostName проверяет, соответствует ли указанное имя узла требованиям к допустимому имени узла в Интернете. (https://docs.microsoft.com/ru-ru/dotnet/api/system.uri.checkhostname?view=netframework-4.8)
- тут им разгуляться особо негде, крылья будут быстро подрезаны. :)
YuS_2, у них там много чего разрешено:
PS C:\> [uri]::CheckHostName('device.doma_in.zone')
Dns
PS C:\> [uri]::CheckHostName('device.doma----in.zone')
Dns
PS C:\> [uri]::CheckHostName('260.260.260.260')
Dns
А вот тут: dns - Can (domain name) subdomains have an underscore "_" in it? - Stack Overflow (https://stackoverflow.com/questions/2180465/can-domain-name-subdomains-have-an-underscore-in-it/14622263) идёт нешуточная битва как раз про это.
P.S. «После речи президента последует пресс-конференция о том, как следует понимать то, о чём он хотел сказать»™ :lol:.
у них там много чего разрешено »
это да. Но второй и третий, вроде не запрещено... буквы-цифры-и-дефис-между-ними. Там где 260, это не IP, так что вроде бы правильно определено...
После речи президента последует пресс-конференция о том, как следует понимать то, о чём он хотел сказать »
где-то, примерно так и есть, судя по той дискуссии... :)
megaloman
01-12-2019, 16:56
уже есть гигантский скрипт на vbs, надо мне будет этот кусок туда внедрить. »
Значит, надо написать функцию, вызов которой можно вставить, например, в If, в аргументе которой DNS, а возвращает она или Истину (правильное DNS) или Ложь. MsgBox "Device1.domain1.ru" + " === " + CStr(X_DNS("Device1.domain1.ru"))
MsgBox "Device1.domain+1.ru" + " === " + CStr(X_DNS("Device1.domain+1.ru"))
MsgBox "Device1.domainЪ1.ru" + " === " + CStr(X_DNS("Device1.domainЪ1.ru"))
MsgBox "Device1..domain1.ru" + " === " + CStr(X_DNS("Device1..domain1.ru"))
MsgBox "Device1.domain1-.ru" + " === " + CStr(X_DNS("Device1.domain1-.ru"))
MsgBox ".Device1.domain1.ru" + " === " + CStr(X_DNS(".Device1.domain1.ru"))
MsgBox "Device1.domain1.ru-" + " === " + CStr(X_DNS("Device1.domain1.ru-"))
MsgBox "device-2.domain.1.ru3" + " === " + CStr(X_DNS("device-2.domain.1.ru3"))
MsgBox "45-deVice.3.domain-4.5ru" + " === " + CStr(X_DNS("45-deVice.3.domain-4.5ru"))
'''''''''''''''''''''''''''''
Function X_DNS(x)
X_DNS = True
With CreateObject("VBScript.RegExp")
.Pattern = "^([a-z0-9]|[a-z0-9][a-z0-9\-]{0,61}[a-z0-9])(\.([a-z0-9]|[a-z0-9][a-z0-9\-]{0,61}[a-z0-9]))*$"
.IgnoreCase = True
.Global = True
X_DNS = .Test(x)
If Not X_DNS Then Exit Function
End With
X_DNS_Err = Array("..", "--", "-.", ".-")
X_DNS_Err1 = Array(".", "-")
For Each X_DNS_i In X_DNS_Err
X_DNS = InStr(1, x, X_DNS_i) = 0
If Not X_DNS Then Exit Function
Next
For Each X_DNS_i In X_DNS_Err1
X_DNS = Left(x, 1) <> X_DNS_i And Right(x, 1) <> X_DNS_i
If Not X_DNS Then Exit Function
Next
End Function
Там где 260, это не IP, так что вроде бы правильно определено... »
Это-то понятно. Я про то, что — «гольные цифры», никаких там тебе:
<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
;).
Я про то, что — «гольные цифры», никаких там тебе »
Да, то, что является проверкой доменного имени в dotnet, явно не соответствует rfc1034. Ни объяснить, ни аргументировать это я не могу... тут только если микрософт соизволит пояснить свое творение, но для этого надо их как-то достать. У меня нет ни желания, ни возможностей для этого, так что воспримем это как данность. :)
У меня нет ни желания, ни возможностей для этого, так что воспримем это как данность. »
Присединюсь, коллега! :)
Пример с шаблоном, найденным мною, и шаблоном коллеги DJ Mogarych: »
А как в шаблон добавить "_", но чтобы нельзя было "__" или "._" или "_."? И чтобы с "_" не начиналось и не оканчивалось?
Ну, попробуйте (последние четыре элемента):
Option Explicit
Dim arrDNSName
Dim elem
arrDNSName = Array( _
"device.domain.zone", _
"Device1.domain1.ru", _
"device--2.domain.1.ru3", _
"45-deVice.3.domain-4.5ru", _
"45-deVice..domain-4.5ru", _
"45-deVice.3.domain--4.5ru", _
"45-deVice.3.domain-.5ru", _
"45-deVice.3.-domain.5ru", _
"45-deVice.3.domain-4.5ru.", _
"dev_ice.domain.ru", _
"dev__ice.domain.ru", _
"_device.domain.ru", _
"device_.domain.ru" _
)
With WScript.CreateObject("VBScript.RegExp")
.IgnoreCase = False
For Each elem In arrDNSName
.Pattern = "^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9]))*$"
If .Test(elem) Then
.Pattern = "-{2,}"
If Not .Test(elem) Then
.Pattern = "_{2,}"
If Not .Test(elem) Then
WScript.Echo "Match: " & elem
Else
WScript.Echo "Not match: " & elem
End If
Else
WScript.Echo "Not match: " & elem
End If
Else
WScript.Echo "Not match: " & elem
End If
Next
End With
WScript.Quit 0
https://i.imgur.com/qpxHcKM.png
Iska, спасибо! Все работает прекрасно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.