What is the best way of validating an IP Address?

后端 未结 10 839
时光取名叫无心
时光取名叫无心 2020-12-25 10:08

I have a method to validate a parameter IP Address. Being new to development as a whole I would like to know if there is a better way of doing this.



        
相关标签:
10条回答
  • 2020-12-25 10:32

    The best Regex solution (useful for 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]?)$")
    
    0 讨论(0)
  • 2020-12-25 10:34

    You can process like that it it is either an ipv4 or 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;
        }
    
    0 讨论(0)
  • 2020-12-25 10:35

    If you want to just check if is valid do only:

    bool isValid = IPAddress.TryParse(stringIP, out IPAddress _);

    It will valid even if this is above 255 and if have dots, so no need to check it.

    0 讨论(0)
  • 2020-12-25 10:40

    try with this:

    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;
            }
        }
    
    0 讨论(0)
  • 2020-12-25 10:42
    using System.Net;
    public static bool CheckIPValid(string strIP)
    {
        IPAddress result = null;
        return
            !String.IsNullOrEmpty(strIP) &&
            IPAddress.TryParse(strIP, out result);
    }
    

    and you're done

    Edit 1

    Added some additional checks to prevent exceptions being thrown (which are costly). PS it won't handle unicode.

    Edit 2

    @StephenMurby IPAddress.TryParse will return true if it successfully parsed the string. If you check the documentation for the method though it will throw an exception in two cases.

    1. The string is null.
    2. The string contains unicode characters.

    Its up to you to decide (design decision) whether you want to throw exceptions or return false. When it comes to parsing I generally prefer to return false rather than exceptions (the assumption being this is input that's not guaranteed to be correct).

    Breaking the return statement down, I am saying,

    1. The string is not null (nor empty which won't parse anyway) AND
    2. The IP address parses correctly.

    Remember C# boolean expressions are lazy evaluated, so the CLR won't attempt to even parse the string if it is null or empty.

    About the missing if, you can do something like,

    if (IP.TryParse(strIP, out result)
    {
        return true;
    }
    

    But all you really doing is saying if something is true, return true. Easier to just return the expression straight away.

    0 讨论(0)
  • 2020-12-25 10:43

    Surprised no one offered a Regex solution. All you need is to include System.Text.RegularExpressions. For readability both in actual code and for this example, I ALWAYS chunk my regex pattern into a string array and then join it.

            // 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));
    
    0 讨论(0)
提交回复
热议问题