PHP 8.3.4 Released!

inet_pton

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

inet_ptonConvertit une adresse IP lisible en sa représentation in_addr

Description

inet_pton(string $ip): string|false

Convertit une adresse IPv4 ou IPv6 (si PHP a été compilé avec le support IPv6) humainement lisible en une structure binaire appropriée de famille d'adresses 32 bit ou 128 bit.

Liste de paramètres

ip

Une adresse IPv4 ou IPv6.

Valeurs de retour

Retourne la représentation in_addr de l'adresse fournie par le paramètre ip ou false si le paramètre ip fourni a une synthaxe invalide (par exemple, une adresse IPv4 sans point, ou une adresse IPv6 sans virgule).

Exemples

Exemple #1 Exemple avec inet_pton()

<?php
$in_addr
= inet_pton('127.0.0.1');

$in6_addr = inet_pton('::1');
?>

Voir aussi

  • ip2long() - Convertit une chaîne contenant une adresse (IPv4) en notation décimale à point en une adresse entier long
  • long2ip() - Convertit une adresse entier long (IPv4) en sa notation décimale à point
  • inet_ntop() - Convertit un paquet d'adresses internet en une représentation humainement lisible

add a note

User Contributed Notes 8 notes

up
19
TuRn3r
9 years ago
Be careful, address with leading 0 return false.

Example :
<?php
inet_pton
('172.27.1.04'); // return false
inet_pton('172.27.1.4') ;// return the good result
?>
up
9
me at diogoresende dot net
17 years ago
If you want to use the above function you should test for ':' character before '.'. Meaning, you should check if it's an ipv6 address before checking for ipv4.
Why? IPv6 allows this type of notation:

::127.0.0.1

If you check for '.' character you will think this is an ipv4 address and it will fail.
up
11
francis dot besset at gmail dot com
12 years ago
It is possible to verify if PHP was compiled with --disable-ipv6 option by AF_INET6 constant.

<?php

if (defined('AF_INET6')) {
echo
"PHP was compiled without --disable-ipv6 option";
} else {
echo
"PHP was compiled with --disable-ipv6 option";
}

?>
up
3
admin at hanzlsoft dot eu
3 years ago
Regarding the ::127.0.0.1 notation

It is a very special case that needs not to be handled. This kind of notation is reserved for ipv4-compatible ipv6 address.
For example the notation ::ffff:192.0.2.128 can be easily read as "ipv6 address that maps to ipv4 address 192.0.2.128"

However as RFC says:
https://tools.ietf.org/html/rfc5156#page-2

2.2. IPv4-Mapped Addresses

::FFFF:0:0/96 are the IPv4-mapped addresses [RFC4291]. Addresses
within this block should not appear on the public Internet.

2.3. IPv4-Compatible Addresses

::<ipv4-address>/96 are the IPv4-compatible addresses [RFC4291].
These addresses are deprecated and should not appear on the public
Internet.

This means that you only need to handle this kind of notation if you need to be compatible with private IP's
up
10
strata_ranger at hotmail dot com
14 years ago
If the input string is not a readable IP address, inet_pton() generates an E_WARNING and returns FALSE. The same is true for inet_ntop().

Also, inet_pton() does not recognize netmask notation (e.g: "1.2.3.4/24" or "1:2::3:4/64") in the input string. This differs from how some database systems (like postgreSQL) support IP address types, so if you need that sort of functionality when processing IP addresses in PHP you'll have to write it in yourself.

A rough example:

<?php

// Sample IP addresses
$ipaddr = '1.2.3.4/24'; // IPv4 with /24 netmask
$ipaddr = '1:2::3:4/64'; // IPv6 with /64 netmask

// Strip out the netmask, if there is one.
$cx = strpos($ipaddr, '/');
if (
$cx)
{
$subnet = (int)(substr($ipaddr, $cx+1));
$ipaddr = substr($ipaddr, 0, $cx);
}
else
$subnet = null; // No netmask present

// Convert address to packed format
$addr = inet_pton($ipaddr);

// Let's display it as hexadecimal format
foreach(str_split($addr) as $char) echo str_pad(dechex(ord($char)), 2, '0', STR_PAD_LEFT);
echo
"<br />\n";

// Convert the netmask
if (is_integer($subnet))
{
// Maximum netmask length = same as packed address
$len = 8*strlen($addr);
if (
$subnet > $len) $subnet = $len;

// Create a hex expression of the subnet mask
$mask = str_repeat('f', $subnet>>2);
switch(
$subnet & 3)
{
case
3: $mask .= 'e'; break;
case
2: $mask .= 'c'; break;
case
1: $mask .= '8'; break;
}
$mask = str_pad($mask, $len>>2, '0');

// Packed representation of netmask
$mask = pack('H*', $mask);
}

// Display the netmask as hexadecimal
foreach(str_split($mask) as $char) echo str_pad(dechex(ord($char)), 2, '0', STR_PAD_LEFT);

?>
up
3
dave at php dot net
9 years ago
If you are receiving an "Unrecognized address" error for an IPv6 address, it's possible your version of PHP has not been compiled with IPv6 support.

To check, load up phpinfo(); and look to see if "IPv6 Support" is set to "disabled".
up
-11
tobias
7 years ago
Oh my god:

0000:0000:0000:0000:0000:0000:0127:2258
becomes '"X.

Do not forget to escape it
up
-14
eric at vyncke org
16 years ago
Not so easy in the function below... It is not handling the case of '::' which can happen in an IPv6 and represents any number of 0, addresses could be as simple as ff05::1
To Top