Actuellement, presque tous les visiteurs utilisent encore l’IPv4, le système d’adressage IP connu depuis très longtemps (xxx.xxx.xxx.xxx où xxx appartient à [0;255]). Plus de 90% des 232 possibilitées d’adresses IPv4 (pour Version 4) sont actuellement utilisées. A l’heure actuelle, seulement Free connecte ses internautes en IPv6, seulement, ce mode de connexion est amené à évoluer très rapidement du fait de l’importance crutiale de cette migration. En effet, s’il n’y as plus d’adresses IP disponibles, vous ne pourrez plus vous connecter à Internet…
Note: Les regex ci-dessous sont des regex en PCRE. C’est-à-dire qu’elles sont exploitables telle qu’elles sont avec les fonction commençant par preg_ telle que preg_match.
Détecter une adresse v4
La structure de l’adresse IP version 4 est très simple. Elle est contituée de 4 nombres allant de 0 à 255 séparés par un point : 1.2.3.4
La regex correspondante est la suivante :
^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Il y a beaucoup plus simple, comme :
^([0-9]{1,3}.)}3}.([0-9]{1,3})$
Cependant, cette REGEX est beaucoup moins complète car elle accepte les adresses comme 999.999.999.999 par exemple, complètement invalides car elles sortent de la plage d’adresses disponibles.
Les adresses IPv6
A voir: Gérer les adresses IPv6 avec Net_IPv6.
La structure des adresses IPv6 est très complexe. En effet, contrairement à l’IPv4, les mêmes adresses IPv6 peuvent s’écrire différement. Par exemple, l’adresse 0:0:0:0:0:0:0:1 est la même que l’adresse ::1. Cette complexité se traduit par une REGEX très longue car elle comprend en elle-même les types d’adresse IPv6 possibles. La voici :
^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b).){3}(b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b))|(([0-9A-Fa-f]{1,4}:){0,5}:((b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b).){3}(b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b))|(::([0-9A-Fa-f]{1,4}:){0,5}((b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b).){3}(b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$
Cette REGEX n’est pas la plus simple mais elle as le mérite de faire ce qu’on lui demande, avec tous les types de nouvelles adresses.
IPv6 et IPv4 ?
Si vous souhaitez simplement tester la validitée d’une adresse IP, sans savoir quelle version est-ce, combinez les deux expressions pour donner :
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b).){3}(b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b))|(([0-9A-Fa-f]{1,4}:){0,5}:((b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b).){3}(b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b))|(::([0-9A-Fa-f]{1,4}:){0,5}((b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b).){3}(b((25[0-5])|(1d{2})|(2[0-4]d)|(d{1,2}))b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$
Performances ?
Pour ce qui est de l’éfficacité de cette dernière REGEX, combinant les deux types d’IPs, sur un serveur avec un load average de 0.10, voici quelques tests de parsage avec preg_match :
-
127.0.0.1 Valide - 1.82151794434.10-4 s -
::1 Valide - 8.70227813721.10-5 s -
92.123.25.32 Valide - 4.41074371338.10-5 s -
2001:41D0:1:2E4e::/64 Invalide - 1.48773193359.10-4 s -
2001:41D0:1:2E4e::1 Valide - 2.98023223877.10-5 s -
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff Valide - 2.40802764893.10-5 s -
nimportequoi Invalide - 4.6968460083.10-5 s
Malgré la taille, les performances sont tout de même excellentes.
Merci beaucoup pour ce regexp (bien qu’incompréhensible à mon niveau).
En espérant que php implémente prochainement des fonctions toutes faites (ne serait-ce que pour les ip2long). Mais merci
La fonction est déjà implémenté depuis des lustre en php enfin depuis la version 5.2 elle activé par defaut
ces les filtres un http://php.net/filter vous donnera plus d’informations,
donc plus besoins de regex pour les ip email url ect….
sinon si c’est juste pour connaitre son adresse ip v6 ou v4 par exemple ya http://adresseipv6.com
The combined RegEx has a bug … When i checked with this ip “02001:0000:1234:0000:0001:C1C0:ABCD:0876″ and this is an invalid ip it still shows that ip addr is right in the first hex column if i add anything before 2001 like ” aasdfghj2001:0000:123 etc” it still shows true… I am not good at regex if you can modify your reg ex and post here it will be great…!!!
Probleme si on tape une IP du genre 124.8.57.258
Sunand, the valid regexp is :
/^(?:25[0-5]|2[0-4]d|[01]?d{1,2})(?:.(?:25[0-5]|2[0-4]d|[01]?d{1,2})){3}$|^(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(?:(?:[0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(?:(?:[0-9A-Fa-f]{1,4}:){5}:(?:[0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(?:(?:[0-9A-Fa-f]{1,4}:){4}:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(?:(?:[0-9A-Fa-f]{1,4}:){3}:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(?:(?:[0-9A-Fa-f]{1,4}:){2}:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?:(?:b(?:(?:25[0-5])|(?:1d{2})|(?:2[0-4]d)|(?:d{1,2}))b).){3}(?:b(?:(?:25[0-5])|(?:1d{2})|(?:2[0-4]d)|(?:d{1,2}))b))|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}:(?:(?:b(?:(?:25[0-5])|(?:1d{2})|(?:2[0-4]d)|(?:d{1,2}))b).){3}(?:b(?:(?:25[0-5])|(?:1d{2})|(?:2[0-4]d)|(?:d{1,2}))b))|(?:::(?:[0-9A-Fa-f]{1,4}:){0,5}(?:(?:b(?:(?:25[0-5])|(?:1d{2})|(?:2[0-4]d)|(?:d{1,2}))b).){3}(?:b(?:(?:25[0-5])|(?:1d{2})|(?:2[0-4]d)|(?:d{1,2}))b))|(?:[0-9A-Fa-f]{1,4}::(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(?:::(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(?:(?:[0-9A-Fa-f]{1,4}:){1,7}:))$/
«02001:0000:1234:0000:0001:C1C0:ABCD:0876» is invalid. Indeed, the operator that combines the two regexp (Or “|”) must have the ^ and $ symbol (begin and end of string) on the two sides.
Yalou, le problème c’est surtout que ton 258 n’est pas bon. Vu que le décimal est compris entre 0 et 255…
Merci beaucoup de ta contribution!
Samuel.