web-dev-qa-db-ja.com

PHP正規表現を使用してIPv4とIPv6を検証する関数

ローカルIPも使用するIPv4およびv6用の関数を作成する必要があります。

私が知っているのは、有効な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を検証するものを作成する方法がわかりません。また、上記の関数の概念のサニティチェックもいいでしょう。

18
chris

編集

この回答に関するNatxetのコメント、およびより良い解決策についてはMorgonの回答を参照してください。

元の回答

inet_pton を使用できます。 IPが有効なIPv6またはIPv4でない場合は、falseを返します。

function validateIP($ip){
    return inet_pton($ip) !== false;
}
21
Paulpro

PHPを確認してください filter_var 関数。 バリデーターの数 (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.
47
Morgon

試してみてください

//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

11
Mark Pro Campos

試してください:

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/

2
Aeron

代わりにfilter_varにチェックインすることをお勧めします。 IPアドレス(IPv4およびIPv6)用のフィルターがあります: http://us.php.net/manual/en/filter.filters.validate.php

2
enygma

MorgonとMarkPro Camposの回答に加えて:

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

1
RafaSashi