2013-03-28 7 views
3

J'ai lu sur la façon de déterminer si une IP est IPv4 ou IPv6 et il me semble évident que la chose à rechercher est de savoir s'il y a un deux-points. Cependant, vous disposez d'adresses IPv6 mappées IPv4 et d'adresses IPv6 compatibles IPv4. Il me semble que ces types d'adresses ont deux-points et périodes, donc au lieu de solutions qui cherchent s'il n'y a pas ::ffff au début de la chaîne, pourquoi ne pas faire ceci:IPV4 vs IPV6 PHP Fonction

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

EDIT: Am Il me manque quelque chose ou cette fonction fonctionnerait-elle correctement dans tous les cas?

+0

est-ce une question? vous semblez fourni une fonction qui détecte IPv6. – Raptor

+0

Pourrait regarder la longueur de l'IP? – Class

+2

Ou vous pouvez le rendre facile sur vous-même et utiliser ['FILTER_FLAG_IPV4' ou' FILTER_FLAG_IPV6' avec 'filter_var()'] (http://php.net/manual/fr/function.filter-var.php). –

Répondre

3

De 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 

Vous ne validez que le format Pure d'IPv6. Je suggère également d'utiliser FILTER_FLAG_IPV4 or 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; 
    } 
} 
+0

Les IPv6 doubles ne sont-ils pas uniquement des IPv4 en format semi-IPv6? –

+0

La logique dans votre fonction est fondamentalement 'return strpos ($ ip, ':')! == false;' :) –

5

PHP => 5.2 a une approche "intégrée" pour le faire en utilisant filter_var

Votre fonction pourrait ressembler à ceci:

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 
    } 

} 
+1

Quel est le problème avec la fonction que j'ai fournie, cependant? –

+2

Le problème est que '12:29 AM' serait effectivement vrai. Votre évaluation est trop simpliste. Si vous voulez l'implémenter vous-même, vous devriez envisager de le faire en utilisant des expressions régulières. – Ares

+1

Eh bien, c'est en supposant que la fonction est utilisée sur à peu près n'importe quelle entrée. Cette fonction est destinée à être utilisée avec des adresses IP valides. Nous supposons déjà que l'entrée est IP IPv4 ou IP IPv6. Toutes les fonctions n'ont pas besoin de tout valider pour s'assurer que l'entrée est valide pour commencer. Le programmeur utilisant la fonction doit aussi avoir un peu de bon sens ... –

1

En supposant que l'adresse IP est valide et en sachant que vous pouvez avoir IPv6 mis en correspondance des adresses IPv4, par exemple ::ffff:127.0.0.1, juste vérifier l'existence de : devrait suffire.

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

Si elle ne peut pas être valide, vous devez d'abord le valider:

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

BTW, voici comment gère PHP IPv6 et, comme vous pouvez le voir the source.

Questions connexes