我有一个方法来验证参数IP地址。作为一个整体的开发新手,我想知道是否有更好的方法来做到这一点。
/// <summary>
/// Check IP Address, will accept 0.0.0.0 as a valid IP
/// </summary>
/// <param name="strIP"></param>
/// <returns></returns>
public bool CheckIPValid(string strIP)
{
// Split string by ".", check that array length is 3
char chrFullStop = '.';
string[] arrOctets = strIP.Split(chrFullStop);
if (arrOctets.Length != 4)
{
return false;
}
// Check each substring checking that the int value is less than 255 and that is char[] length is !> 2
Int16 MAXVALUE = 255;
Int32 temp; // Parse returns Int32
foreach (string strOctet in arrOctets)
{
if (strOctet.Length > 3)
{
return false;
}
temp = int.Parse(strOctet);
if (temp > MAXVALUE)
{
return false;
}
}
return true;
}
它很简单(我可以做到),但它似乎可以解决问题。
方法的限制是它验证字符串是否可以转换为IP地址,因此如果提供像
"5"
这样的字符串值,它会认为它是"0.0.0.5"
。
验证 IPv4 的另一种方法可能如下:
public bool ValidateIPv4(string ipString)
{
if (String.IsNullOrWhiteSpace(ipString))
{
return false;
}
string[] splitValues = ipString.Split('.');
if (splitValues.Length != 4)
{
return false;
}
byte tempForParsing;
return splitValues.All(r => byte.TryParse(r, out tempForParsing));
}
可以这样测试:
List<string> ipAddresses = new List<string>
{
"2",
"1.2.3",
"1.2.3.4",
"255.256.267.300",
"127.0.0.1",
};
foreach (var ip in ipAddresses)
{
Console.WriteLine($"{ip} ==> {ValidateIPv4(ip)}");
}
输出将是:
2 ==> False
1.2.3 ==> False
1.2.3.4 ==> True
255.256.267.300 ==> False
127.0.0.1 ==> True
您也可以使用
IPAddress.TryParse
但它有局限性并且可能会导致错误的解析。
System.Net.IPAddress.TryParse方法
请注意,如果 TryParse 成功解析输入,则返回 true, 但这并不一定意味着生成的 IP 地址 是有效的。 请勿使用此方法来验证 IP 地址。
但这适用于包含至少三个点的普通字符串。比如:
string addrString = "192.168.0.1";
IPAddress address;
if (IPAddress.TryParse(addrString, out address)) {
//Valid IP, with address containing the IP
} else {
//Invalid IP
}
使用
IPAddress.TryParse
,您可以检查是否存在三个点,然后调用 TryParse
,如下所示:
public static bool ValidateIPv4(string ipString)
{
if (ipString.Count(c => c == '.') != 3) return false;
IPAddress address;
return IPAddress.TryParse(ipString, out address);
}
最好的正则表达式解决方案(对于 MVC DataAnnotations 很有用):
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
C#
Regex.IsMatch(value, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")
using System.Net;
public static bool CheckIPValid(string strIP)
{
IPAddress result = null;
return
!String.IsNullOrEmpty(strIP) &&
IPAddress.TryParse(strIP, out result);
}
你就完成了
编辑1
添加了一些额外的检查以防止抛出异常(这是昂贵的)。 PS 它不能处理 unicode。
编辑2
如果成功解析字符串,@StephenMurby
IPAddress.TryParse
将返回 true。如果您检查该方法的文档,尽管它会在两种情况下抛出异常。
由你决定(设计决策)是否要抛出异常或返回 false。当谈到解析时,我通常更喜欢返回 false 而不是异常(假设这是不保证正确的输入)。
分解 return 语句,我是说,
请记住,C# 布尔表达式是惰性求值,因此如果字符串为
null
或空,CLR 甚至不会尝试解析该字符串。
关于缺失的如果,你可以做类似的事情,
if (IP.TryParse(strIP, out result)
{
return true;
}
但你真正做的只是说如果某事为真,则返回 true。直接返回表达式会更容易。
无需使用 IPAddress 类并根据字节进行验证,这比 Int 好得多<256 approach.
public Boolean CheckIPValid(String strIP)
{
// Split string by ".", check that array length is 4
string[] arrOctets = strIP.Split('.');
if (arrOctets.Length != 4)
return false;
//Check each substring checking that parses to byte
byte obyte = 0;
foreach (string strOctet in arrOctets)
if (!byte.TryParse(strOctet, out obyte))
return false;
return true;
}
框架提供了
IPAddress
类,该类又为您提供了 Parse
和 TryParse
方法。
// myAddress is a System.Net.IPAddress instance
if (System.Net.IPAddress.TryParse(strIP , out myAddress))
// IP is valid
else
// IP isn't valid
令人惊讶的是没有人提供正则表达式解决方案。您所需要的只是包含 System.Text.RegularExpressions。为了实际代码和本示例的可读性,我总是将正则表达式模式分块到字符串数组中,然后加入它。
// Any IP Address
var Value = "192.168.0.55";
var Pattern = new string[]
{
"^", // Start of string
@"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.", // Between 000 and 255 and "."
@"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.",
@"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.",
@"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])", // Same as before, no period
"$", // End of string
};
// Evaluates to true
var Match = Regex.IsMatch(Value, string.Join(string.Empty, Pattern));
您可以这样处理它是 ipv4 或 ipv6:
public static string CheckIPValid(string strIP)
{
//IPAddress result = null;
//return !String.IsNullOrEmpty(strIP) && IPAddress.TryParse(strIP, out result);
IPAddress address;
if (IPAddress.TryParse(strIP, out address))
{
switch (address.AddressFamily)
{
case System.Net.Sockets.AddressFamily.InterNetwork:
// we have IPv4
return "ipv4";
//break;
case System.Net.Sockets.AddressFamily.InterNetworkV6:
// we have IPv6
return "ipv6";
//break;
default:
// umm... yeah... I'm going to need to take your red packet and...
return null;
//break;
}
}
return null;
}
尝试一下:
private bool IsValidIP(String ip)
{
try
{
if (ip == null || ip.Length == 0)
{
return false;
}
String[] parts = ip.Split(new[] { "." }, StringSplitOptions.None);
if (parts.Length != 4)
{
return false;
}
foreach (String s in parts)
{
int i = Int32.Parse(s);
if ((i < 0) || (i > 255))
{
return false;
}
}
if (ip.EndsWith("."))
{
return false;
}
return true;
}
catch (Exception e)
{
return false;
}
}
如果您只想检查是否有效,只需:
bool isValid = IPAddress.TryParse(stringIP, out IPAddress _);
即使高于255并且有点也有效,所以不需要检查。
要验证 IP 地址,请使用以下包
套餐:-
using System.Net; //To use IPAddress, inbuilt functionality
using System.Net.Sockets; //To access AddressFamily,
using System.Text.RegularExpression; //For Regex.IsMatch()
方法:-
public bool ValidIPAddress(string IP)
{
//Validate IP Address , neither IPV4, or V6
if (IPAddress.TryParse(IP, out var address) == false)
return false;
//check for IPV6
if (address.AddressFamily == AddressFamily.InterNetworkV6)
{
if (IP.IndexOf("::") > -1)
return true;
return false;
}
//check for IPV4
else
{
//Ipv4 address shouldn't start with 0 eg..it is invalid 0XX.0XX.0XX.0XX
if (Regex.IsMatch(IP, @"(^0\d|\.0\d)"))
return false;
else if (IP.Count(c => c == '.') != 3)
return false;
else
return true;
}
}
如果需要,请检查以下链接:-
https://lncharan.blogspot.com/2020/09/validate-ip-address-in-c.html
有一个简单的方法可以做到这一点,但它需要互联网连接来检查 IP 或主机名:
using System;
using System.Net;
var dnsAddress = ///
try
{
// IP like 8.8.8.8
if (IPAddress.TryParse(dnsAddress, out var ipAddress)
&& Dns.GetHostAddresses(ipAddress.ToString()).Length >= 1)
{
return true;
}
// Hostname like smtp.gmail.com
if (Dns.GetHostEntry(dnsAddress).AddressList.Length >= 1)
{
return true;
}
return false;
}
catch (Exception exception) when (
exception is ArgumentNullException
|| exception is ArgumentOutOfRangeException
|| exception is System.Net.Sockets.SocketException
|| exception is ArgumentException
)
{
// Write log message, if necessary
return false;
}
//To accept values where the ip does not contain zero in the first position of the IPv4 in C# code
/// <summary>
/// Check IP Address, will accept [255-1].0.0.0 as a valid IP
/// </summary>
/// <param name="strIP"></param>
/// <returns></returns>
public bool CheckIPv4Valid(string strIPv4)
{
// Split string by ".", check that array length is 3
char chrFullStop = '.';
string[] arrOctets = strIPv4.Split(chrFullStop);
if (arrOctets.Length != 4)
{
return false;
}
// Check each substring checking that the int value is less than 255 and that is char[] length is !> 2
Int16 MAXVALUE = 255;
Int32 tempNumber; // Parse returns Int32
#region New code
Int32 tempNumberCero;
tempNumberCero = int.Parse(arrOctets[0]);
if (tempNumberCero <= 0)
{
return false;
}
#endregion
foreach (string strOctet in arrOctets)
{
if (strOctet.Length > 3)
{
return false;
}
tempNumber = int.Parse(strOctet);
if ((tempNumber > MAXVALUE))
{
return false;
}
}
return true;
}
我想与您分享我的解决方案。 它基于正则表达式,灵感来自 Oreilly 正则表达式食谱。
public class ValidAndCleanedIP
{
public bool IsValid { get; set; }
public string IP { get; set; }
}
public ValidAndCleanedIP ValidAndCleanIP(string ip)
{
// ^(?!0)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) (?!0) check if the numeric part starts not with zero, optional you can use this pattern (25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1][0-9]|[1-9])
// there is no check for leading zero becaus there is it possible to order the IP Addresses
string pattern = "" +
"^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
Regex regex = new Regex(pattern);
bool test = regex.IsMatch(ip);
ValidAndCleanedIP validAndCleanedIP = new ValidAndCleanedIP();
validAndCleanedIP.IsValid = test;
if (test)
{
//version removes leading zeros after the dots
validAndCleanedIP.IP = new Version(ip).ToString();
}
else
{
validAndCleanedIP.IP = string.Empty;
}
return validAndCleanedIP;
}
或更简单的解决方案
public bool Is_Valid_IP(string ip)
{
// (?!0) check if the numeric part starts not with zero
string pattern = "" +
"^(?!0)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(?!0)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(?!0)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(?!0)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
Regex regex = new Regex(pattern);
return regex.IsMatch(ip);
}
大家美好的一天
哇! 对于简单的一行代码,答案的内容非常庞大。
看这个!
using System.Text.RegularExpressions;
namespace Helper;
public class IpHelper
{
public static bool IsIpValid(string ip) =>
new Regex("^(?!0)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?!0)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?!0)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?!0)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")
.IsMatch(ip);
}
用途:
IpHelper.IsIpValid("192.168.1.1"):
利用上面的一些答案,以及 Copilot 的一些帮助(第 15 个检查):
public static bool ValidateIPv4(string ipString)
{
// 15 is the max length of an IP address (xxx.xxx.xxx.xxx)
if (!string.IsNullOrWhiteSpace(ipString) && ipString.Length <= 15)
{
if (ipString.Count(c => c == '.') == 4)
{
if (IPAddress.TryParse(ipString, out IPAddress? address))
{
if (address.ToString() == ipString)
{
return true;
}
}
}
}
return false;
}