2012-03-07 254 views
15

我需要爲IPv4和v6創建一個函數,以便使用本地ip。使用正則表達式驗證IPv4和IPv6的PHP函數

我所知道的是一個有效的IPv4範圍從0.0.0.0到255.255.255.255 我所知道的IPv6是有限的,儘管它已經有一段時間了,直到今天我還沒有真正看到太多。但我希望將來可以證明我正在做的一點功能,同時保持它有點復古。我不確定IPv6的有效範圍是什麼。

反正總的來說我的想法是的

function validateIP($ip, $vSix = NULL) 
{ 
    if($vSix !== NULL) 
    { 
     if(preg_match([regex-to-validate-ipv6], $ip)) 
     { 
     return true; 
     } 
     else 
     { 
     return false; 
     } 
    } 

    if(preg_match([regex-to-validate-ipv4], $ip)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

我的事程度的一個功能是我正則表達式吸所以我不知道如何編寫一個將驗證V4或6.又一個上述功能概念的健全性檢查也會很好。

回答

19

編輯

請參閱Natxet對這個答案上海摩根的答案更好的解決辦法評論,。

原來的答案

你可以只使用inet_pton

function validateIP($ip){ 
    return inet_pton($ip) !== false; 
} 
+0

男人我得趕上php.net讀一些我甚至沒有意識到的新功能。這非常簡單而性感。我想我會在閱讀完這篇文章之後繼續閱讀。獎勵! – chris 2012-03-07 19:55:13

+2

小心!這個函數會發出警告,請不要在函數名前使用@來消除這個警告。您應該避免使用此功能來檢查正確的IP。作爲@ marc-pro-campos點,選項'return filter_var($ ip,FILTER_VALIDATE_IP));'似乎最適合你 – Natxet 2015-04-23 09:21:32

42

檢查PHP的filter_var函數。它有一個number of validators,包括IPv4和IPv6。

$isValid = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); 
// $isValid can be evaluated as boolean, as it's FALSE if validation fails. 
+0

真棒的想法,不知道爲什麼I F一定要記住那個,但是好的電話+1 – chris 2012-03-07 19:51:55

+4

這應該是被接受的答案。 – 2013-08-02 19:22:06

+0

'$ isValid'是__not__'boolean'。從文檔:返回過濾的數據,如果過濾器失敗,則返回FALSE。 – schnittstabil 2015-05-18 07:29:42

2

搜索:如果IP不是有效的IPv6或IPv4返回false

的IPv4

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

的IPv6

/^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/i 

來源: http://home.deds.nl/~aeron/regex/

+0

\ z到底做了什麼? – cwd 2014-08-15 19:32:43

10

嘗試

//validates IPV4 and IPV6 
$isValid = filter_var($ip, FILTER_VALIDATE_IP)); 

//validates IPV4 
$isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)); 

//validates IPV6 
$isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6)); 

http://www.php.net/manual/en/filter.filters.validate.php

+0

這是正確的方法。 – tfont 2016-09-01 13:14:16

1

除了上海摩根和馬克臨坎波斯答案:

function is_valid_ip($ip='', $ip_type=''){ 

    $isValid=false; 

    if($ip_type=='ipv4'){ 

     //validates IPV4 
     $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4); 
    } 
    elseif($ip_type=='ipv6'){ 

     //validates IPV6 
     $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6); 
    } 
    else{ 

     //validates IPV4 and IPV6 
     $isValid = filter_var($ip, FILTER_VALIDATE_IP); 
    } 

    if($isValid == $ip){ 

     $isValid=true; 
    } 

    return $isValid; 
} 

資源

http://php.net/manual/en/function.filter-var.php