我知道正则表达式对于验证IP地址是危险的,因为IP地址可以采用不同的形式.
我见过类似的C和C++问题,这些问题是用C#inet_ntop()中不存在的函数解决的.
我发现的.NET解决方案只处理标准的"ddd.ddd.ddd.ddd"表单.有什么建议?
您可以使用它来尝试解析它:
IPAddress.TryParse
然后检查AddressFamily
其
返回IPv4的System.Net.Sockets.AddressFamily.InterNetwork或IPv6的System.Net.Sockets.AddressFamily.InterNetworkV6.
编辑:一些示例代码.根据需要改变:
string input = "your IP address goes here"; IPAddress address; if (IPAddress.TryParse(input, out address)) { switch (address.AddressFamily) { case System.Net.Sockets.AddressFamily.InterNetwork: // we have IPv4 break; case System.Net.Sockets.AddressFamily.InterNetworkV6: // we have IPv6 break; default: // umm... yeah... I'm going to need to take your red packet and... break; } }
只是警告使用System.Net.IpAddress.TryParse()
:
如果传递一个包含整数(例如"3")的字符串,TryParse函数会将其转换为"0.0.0.3",因此将其转换为有效的InterNetworkV4地址.因此,至少应该将重新格式化的"0.0.0.3"返回给用户应用程序,以便用户知道他们的输入是如何被解释的.
string myIpString = "192.168.2.1"; System.Net.IPAddress ipAddress = null; bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);
如果isValidIp
为true,您可以检查ipAddress.AddressFamily
以确定它是IPv4还是IPv6.它AddressFamily.InterNetwork
适用于IPv4和AddressFamily.InterNetworkV6
IPv6.
你可以检查出System.Uri.CheckHostName(值)返回Unknown
,Dns
,IPv4
,IPv6
.
if( Uri.CheckHostName( value ) != UriHostNameType.Unknown) //then 'value' is a valid IP address or hostname