2011-08-24 121 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十進制。