3

IPがIPv4かIPv6かを判断する方法について読んでいますが、探すべきことはコロンがあるかどうかであることは明らかです。ただし、IPv4 にマッピングされた IPv6 アドレスと、IPv4 互換の IPv6 アドレスがあります。これらのタイプのアドレスにはコロンとピリオドの両方があるように思われるので::ffff、文字列の先頭にないかどうかを調べるソリューションの代わりに、これを実行してみませんか:

function isIPv6($ip) {
  if(strpos($ip, ":") !== false && strpos($ip, ".") === false) {
     return true;
  }
  return false;
}

編集:何か不足していますか、それともこの機能はすべての場合に適切に機能しますか?

4

3 に答える 3

5

PHP => 5.2 には、filter_varを使用してこれを行うための「組み込み」アプローチがあります。

関数は次のようになります。

function isIPv6($ip) {

   if(filter_var($ip, FILTER_VALIDATE_IP)) {

       if(filter_var($ip, FILTER_FLAG_IPV6)) {
          //It is IPv6 indeed.
        } else {
          //It is IPv4
       }

   } else {
      // NOT VALID IP
   }

}
于 2013-03-28T06:20:53.533 に答える
3

IBMから:

An IPv6 address can have two formats:

    Normal - Pure IPv6 format
    2001 : db8: 3333 : 4444 : 5555 : 6666 : 7777 : 8888
    Dual - IPv6 plus IPv4 formats
    2001 : db8: 3333 : 4444 : 5555 : 6666 : 1 . 2 . 3 . 4

IPv6 の Pure 形式を検証するだけで機能します。FILTER_FLAG_IPV4 または FILTER_FLAG_IPV6を使用することもお勧めします

function isIPv6($ip) {
  if(strpos($ip, ":") !== false && strpos($ip, ".") === false) {
     return true; //Pure format
  }
  elseif(strpos($ip, ":") !== false && strpos($ip, ".") !== false){
    return true; //dual format
  }
  else{
  return false;
  }
}
于 2013-03-28T06:23:33.390 に答える
1

IP アドレスが有効であると仮定し、IPv6 にマップされた IPv4 アドレスを使用できることを知っていれば、たとえば::ffff:127.0.0.1の存在を確認するだけ:で十分です。

function isIPv6($address) 
{
    return strpos($address, ':') !== false;
}

有効でない可能性がある場合は、最初に検証する必要があります。

function isIPv6($address) 
{
    return filter_var($address, FILTER_VALIDATE_IP) && 
        strpos($address, ':') !== false;
}

ところで、ソースからわかるように、これは PHP が IPv6 を処理する方法でもあります。

于 2013-03-28T06:38:33.063 に答える