Что нового

[Сеть, интернет] Функция проверки IP-адреса

alex33

Скриптер
Сообщения
1 455
Репутация
183
Допустим вы в окне InputBox запрашиваете у пользователя IP-адрес,
и этот IP-адрес вам надо проверить,
вдруг пользователь ввёл 123.456.789.200 или 1.5.88.15.7.8.4
С помощью этой функции вы можете проверить корректность введённого IP.
Код:
;========== Function ==========;
Func ValidIP($vd_IP)
Local $vd_c, $vd_code
$vd_a = StringSplit($vd_IP, ".")
$vd_c = 1
$vd_code = 0
While $vd_c <= $vd_a[0]
If $vd_a[0] = 4 And StringLen($vd_IP) >= 7 And StringLen($vd_IP) <= 15 _
  And StringIsDigit($vd_a[$vd_c]) And $vd_a[$vd_c] <= 255 Then
If $vd_code = 0 Then $vd_code = 0
Else
$vd_code = $vd_code + 1
EndIf
$vd_c = $vd_c + 1
WEnd
If $vd_code = 0 Then
Return 1
Else
Return 0
EndIf
SetError($vd_code)
EndFunc
;========== EndFunction ==========;

;===== Example =====;
While 1
$MyInput = InputBox("Validation IP", "Enter IP-address", @IPAddress1)
If @error Then Exit
If ValidIP($MyInput) Then
MsgBox(64, "Validation IP", "Valid ok", 0)
ExitLoop
else
MsgBox(16, "Validation IP", "Valid error", 30)
EndIf
WEnd
;===== EndExample =====;
ValidIP ( IPAddress )
параметры
IPAddress строка которую требуется проверить.
Возвращаемые значения
1 IP-адрес введён верно
0 IP-адрес введён не верно
@error содержит код ошибки или 0 если ошибок нет.
ValidIP("127.0.0.1") ; вернёт 1
ValidIP("327.0.0.1") ; вернёт 0
ValidIP("127001") ; вернёт 0
ValidIP("abcde") ; вернёт 0
и так далее.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
alex33,
А почему бы не использовать для этого штатные функции _GUICtrlIpAddress_*?
 
Автор
alex33

alex33

Скриптер
Сообщения
1 455
Репутация
183
альтернатива.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 264
Репутация
2 352
Код:
$sString = @IPAddress1
$iIsValidIp = _StringIsValidIP($sString)
ConsoleWrite($sString & ' Is Valid IP: ' & ($iIsValidIp = 1) & @LF)

Func _StringIsValidIP($sIP_String)
	Return StringRegExp($sIP_String, '^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$')
EndFunc


:laugh:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
CreatoR,
Код:
ConsoleWrite(_StringIsValidIP('999.888.777.666') & @LF)
;D
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 264
Репутация
2 352
madmasles
Поправил :whistle:.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
CreatoR [?]
Так вроде тоже можно и немного короче. :smile:
Код:
ConsoleWrite(StringRegExp('1.1.1.1', '^(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})$') & @LF)

0.1.1.1 неправильный IP?
Еще вариант. :smile:
Код:
ConsoleWrite('0.1.1.1' & @TAB & _IsValidIP('0.1.1.1') & @LF)
For $i = 1 To 10
	$sIP = Random(0, 300, 1) & '.' & Random(0, 300, 1) & '.' & Random(0, 300, 1) & '.' & Random(0, 300, 1)
	ConsoleWrite($sIP & @TAB & _IsValidIP($sIP) & @LF)
Next

Func _IsValidIP($s_IP)
	Local $a_IP, $a_Valid[2] = [1, 255]

	If Not StringIsDigit(StringReplace($s_IP, '.', '')) Then Return False
	$a_IP = StringSplit($s_IP, '.')
	If $a_IP[0] <> 4 Then Return False
	For $i = 1 To 4
		$a_IP[$i] = Int($a_IP[$i])
		Switch $a_IP[$i]
			Case $a_Valid[0] To $a_Valid[1]
				;OK
			Case Else
				Return False
		EndSwitch
		If $a_Valid[0] Then $a_Valid[0] = 0
	Next
	Return True
EndFunc   ;==>_IsValidIP
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
В справке с неделю как появилось новый раздел в "Обучение : Упражнения" там как раз упражнение на тему IP
Код:
ConsoleWrite('0.1.1.1' & @TAB & _IsIP('0.1.1.1') & @LF)
For $i = 1 To 10
    $sIP = Random(0, 300, 1) & '.' & Random(0, 300, 1) & '.' & Random(0, 300, 1) & '.' & Random(0, 300, 1)
    ConsoleWrite($sIP & @TAB & _IsIP($sIP) & @LF)
Next

Func _IsIP($s_IP)
;    Return StringRegExp($s_IP, '^(?:(?:2(?:[0-4]\d|5[0-5])|1?\d{1,2})\.){3}(?:(?:2(?:[0-4]\d|5[0-5])|1?\d{1,2}))$')
    Return StringRegExp($s_IP, '^(?:(?:25[0-5]|2[0-4]\d|1?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|1?\d{1,2})$')
EndFunc   ;==>_IsIP
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 264
Репутация
2 352
Кстати есть ещё и IPv6, вот две функции, которые по идее решают проблему проверки на валидность IP адресов версии 4/6:

Код:
$sString = '127.0.0.0'

$iIsValidIp = _StringIsValidIPv4($sString)
ConsoleWrite($sString & ' Is Valid IP: ' & ($iIsValidIp = 1) & @LF)

$sString = '2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d'

$iIsValidIp = _StringIsValidIPv6($sString)
ConsoleWrite($sString & ' Is Valid IP: ' & ($iIsValidIp = 1) & @LF)

Func _StringIsValidIPv4($sIP_String)
	Return StringRegExp($sIP_String, '^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$')
EndFunc

Func _StringIsValidIPv6($sIP_String)
	Return StringRegExp($sIP_String, '^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$')
EndFunc


Регулярные выражения взяты отсюда.
 
Верх