2011-08-24 124 views
0

我遇到了一个奇怪的IP,它在八位字节中有冗余的零值。无论如何要正确验证这是一个IP还是使用正则表达式去除那些冗余的零?验证特殊形式的IP地址

例子是如下: .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

+0

出于好奇,为什么你想验证一个IP地址?这通常不由用户输入。 – NullUserException

+0

恩,我正在筛选从网站中提取的结果。在这个结果是日期等等等等,我尝试只提取IP :( – phpnoob

回答

0

这会纠正他们:

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

嗯,这并不工作。有毛病破灭声明。 – phpnoob

+0

是啊,我打字了一个修正版本,因为我们说话。等一会儿。 –

+0

有我们去吧,那该工作了。 –

0

你必须接受零这样的:在rubular.com

^(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}$ 

玩这个正则表达式。

0?我添加了匹配零次或一次出现0。例如,0?[1-9][0-9]例如与01010匹配。

+0

它不验证正确:( – phpnoob

+0

它验证对你的给出的例子正确。 – mAu

0

你有没有自己去?这真的很简单。

|1[0-9][0-9]|匹配100-199,因为你现在想匹配000-199(如上它是200-155),你只需要做出的1一组是10

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); 
} 

或者剥夺这些不需要的零点:

function strip_ip($ip) { 
    return preg_replace('/0+([^0])(\.|$)/' , '$1$2' , $ip); 
} 
+0

将是最好的,如果我可以改变当前的IP到一个正常的没有零。谢谢!:) – phpnoob

+0

@phpnoob:见修改答案。 (你的问题越清楚,我们的答案就越清晰。) –

+0

嗯,感谢和抱歉的麻烦。但你的第二个valid_ip有一个无结尾分隔符'^'发现错误。任何想法如何解决它? – phpnoob

0

更改裸|1发生于|[01]。但是你确定这不应该被解释为八进制数?一些解决方案是这样做的。

+0

我想比较IP地址和我的另一个IP没有这个额外的多余的零,因此我必须做一些过滤器:( – phpnoob

0

使用ip2long()

+0

IP2与IP和零之间有差异,他们内部和没有 – phpnoob

+0

ip2long似乎返回正确的值有或没有前导零。 –

+0

嗯我测试给出的问题。我拿出了多余的零,有一个不同的数字显示为ip2long: – phpnoob

0

你应该弄清楚这些额外0来自哪里。那些前导零不能被丢弃。在大多数平台上,它们表示八位字节是八进制而不是十进制。即:064八进制等于52十进制。