验证特殊形式的IP地址

时间:2011-08-24 05:47:57

标签: php regex ip

我遇到了一个奇怪的IP,它在八位字节中有多余的零值。反正是否正确地将其验证为IP或使用正则表达式来删除那些冗余的零?

示例如下: 218. 064 .215.239(记下第二个八位字节“064”的额外零点。)

我确实有一个有效的IP验证功能,但由于正则表达式的性质无法接受额外的零,因此无法正确验证此Ip。以下是PHP中的代码:

function valid_ip($ip) {
    return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" .
            "(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip);
} 

感谢您提前窥视任何帮助! :d

6 个答案:

答案 0 :(得分:0)

这将纠正他们:

$ip = "123.456.007.89";
$octets = explode(".", $ip);
$corrected = array();
foreach ($octets as $octet) {
 array_push($corrected, (int)$octet);
}
echo implode(".", $corrected);

答案 1 :(得分:0)

你必须接受这样的零:

^(0?[1-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.(0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$

rubular.com上使用此正则表达式。

我添加的0?匹配为0零或一次出现。因此,0?[1-9][0-9]例如匹配01010

答案 2 :(得分:0)

你自己去了吗?这真的很简单。

|1[0-9][0-9]|匹配100-199,因为您现在想要匹配000-199(如上所述,它是200-155),您只需要为1设置一个{ {1}}或1

0

这可以重构(允许前导零):

function valid_ip($ip) {
  return preg_match("/^([1-9]|[1-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])".
          "(\.([0-9]|[1-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip);
}

或者去掉这些不需要的零:

function valid_ip($ip) {
  return preg_match("/^([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])".
          "(\.([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){3}$/", $ip);
}

答案 3 :(得分:0)

将裸|1次出现更改为|[01]。你确定这不应该被解释为八进制数吗?有些解析器会这样做。

答案 4 :(得分:0)

使用ip2long()

答案 5 :(得分:0)

你应该找出那些额外的零来自哪里。那些领先的零不能被丢弃。在大多数平台上,它们意味着八位字节是八进制形式而不是十进制形式。即:064八进制等于52十进制。