我遇到了一个奇怪的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
答案 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]
例如匹配010
和10
。
答案 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
十进制。