我正在使用我在浏览时遇到的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;
}
}
答案 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)
您是否尝试过使用内置函数来尝试验证地址?例如,您可以使用ip2long和long2ip将人类可读的虚线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可能更适合您的需求......