IP地址验证帮助

时间:2010-06-14 17:46:12

标签: php validation ip-address

我正在使用我在浏览时遇到的IP验证功能,它一直运行良好,直到今天我遇到了问题。

由于某种原因,该功能不会将此IP验证为有效:203.81.192.26

我对正则表达式不是太好了,所以对于可能出错的任何帮助表示感谢。

如果你有其他功能,如果你能为我发布,我将不胜感激。

该功能的代码如下:

public static function validateIpAddress($ip_addr)
{
    global $errors;

    $preg = '#^(?:(?: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]?)$#';

    if(preg_match($preg, $ip_addr))
    {
        //now all the intger values are separated
        $parts = explode(".", $ip_addr);

        //now we need to check each part can range from 0-255
        foreach($parts as $ip_parts)
        {
            if(intval($ip_parts) > 255 || intval($ip_parts) < 0)
            {
                $errors[] = "ip address is not valid.";
                return false;
            }

            return true;
        }

        return true;
    } else {
        $errors[] = "please double check the ip address.";
        return false;
    }
}

4 个答案:

答案 0 :(得分:8)

已经内置了一些内容:http://fr.php.net/manual/en/filter.examples.validation.php参见示例2

<?php

if (filter_var($ip, FILTER_VALIDATE_IP)) {
    // Valid
} else {
   // Invalid
}

答案 1 :(得分:8)

我更喜欢描述here的简单方法。出于安全考虑,这应被视为有效。虽然请确保从$_SERVER['REMOTE_ADDR']获取,但任何其他http标头都可以被欺骗。

function validateIpAddress($ip){
    return long2ip(ip2long($ip)))==$ip;
}

答案 2 :(得分:4)

您是否尝试过使用内置函数来尝试验证地址?例如,您可以使用ip2longlong2ip将人类可读的虚线IP地址转换为它所代表的数字,然后返回。如果字符串相同,则IP有效。

还有filter extension, which has an IP validation option。默认情况下,在PHP 5.2及更高版本中包含过滤器。

答案 3 :(得分:1)

那么,你为什么要进行正则表达式和int比较?你是“双重”检查地址。此外,您的第二次检查无效,因为如果第一个八位字节有效(在foreach循环内部返回true),它将始终返回true。

你可以这样做:

$parts = explode('.', $ip_addr);
if (count($parts) == 4) {
    foreach ($parts as $part) { 
        if ($part > 255 || $part < 0) {
            //error
        }
    }
    return true;
} else {
    return false;
}

但正如其他人所说,ip2long / long2ip可能更适合您的需求......