2012-03-07 9 views
15

IPv4とv6用の関数を作成する必要がありますが、ローカルIPを使用する必要があります。正規表現を使用してIPv4とIPv6を検証するPHP関数

有効なIPv4の範囲は0.0.0.0〜255.255.255.255です。 IPv6について知っているのは限られていますが、しばらくの間それがあっても、今日はそれほど多くは見ていません。しかし、私は将来私が少し時間をかけてレトロな状態に保ちながら機能を証明したいと思っています。私はIPv6の有効範囲が何であるか分かりません。一般的にはとにかく

私は思っていますが、私の事は、私はまた、V4または6を検証するものを作成する方法を見当がつかないので、私は正規表現を吸うある

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

の程度の関数であります上記の関数コンセプトのサニティチェックもうまくいくでしょう。

答えて

19

編集

この回答にNatxetさんのコメント、およびよりよい解決策のためのモルゴンの回答を参照してください:それは、IPアドレス(IPv4およびIPv6)用のフィルタを持っています。

オリジナル回答

あなただけinet_ptonを使用することができます。 IPが有効なIPv6またはIPv4でない場合はfalseを返します。

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

私は、私が気づいていないこれらの新しい機能のいくつかを読んで、これはとてもシンプルでセクシーです。私はちょうど今それについて読んだ後にこれと一緒に行くつもりだと思う。名誉! – chris

+2

気をつけろ!この関数は警告を投げますので、関数名の前に@を使用しないようにしてください。正しいIPをチェックするためにこの機能を使用しないでください。 @ marc-pro-camposのように、 'return filter_var($ ip、FILTER_VALIDATE_IP));オプションはあなたのために一番良いようです – Natxet

42

PHPのfilter_varの機能を確認してください。 IPv4とIPv6を含むnumber of validatorsがあります。

$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

+4

これは受け入れられた答えでなければなりません。 –

+0

'$ isValid'は__not__' boolean'です。ドキュメントから:フィルタリングされたデータを返します。フィルタが失敗した場合はFALSEを返します。 – schnittstabil

2

試してみてください。

の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

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

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

関連する問題