downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

ip2long> <inet_ntop
Last updated: Fri, 13 Nov 2009

view this page in

inet_pton

(PHP 5 >= 5.1.0)

inet_pton人間が読める形式の IP アドレスを、パックされた in_addr 形式に変換する

説明

string inet_pton ( string $address )

この関数は、人間が読める形式の IPv4 あるいは IPv6 (PHP が IPv6 サポートを有効にしてビルドされている場合) のアドレスを 32 ビットあるいは 128 ビットのバイナリ形式に変換します。

パラメータ

address

可読形式の IPv4 アドレスあるいは IPv6 アドレス。

返り値

指定した addressin_addr 形式で表したものを返します。

例1 inet_pton() の例

<?php
$in_addr 
inet_pton('127.0.0.1');
 
$in6_addr inet_pton('::1');
?>

変更履歴

バージョン 説明
5.3.0 この関数は Windows プラットフォームでも使用可能となりました。

参考

  • ip2long() - (IPv4) インターネットプロトコルドット表記のアドレスを、適当なアドレスを有する文字列に変換する
  • long2ip() - (IPv4) インターネットアドレスをインターネット標準ドット表記に変換する
  • inet_ntop() - パックされたインターネットアドレスを、人間が読める形式に変換する



ip2long> <inet_ntop
Last updated: Fri, 13 Nov 2009
 
add a note add a note User Contributed Notes
inet_pton
strata_ranger at hotmail dot com
13-Sep-2009 05:51
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);

?>
eric at vyncke org
18-Jul-2007 05:52
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
me at diogoresende dot net
16-May-2006 09:34
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.
djmaze(AT)dragonflycms(.)org
14-Dec-2005 08:01
If you need the functionality but your PHP version doesn't have the functionality (like on windows) the following might help

<?php
function inet_pton($ip)
{
   
# ipv4
   
if (strpos($ip, '.') !== FALSE) {
       
$ip = pack('N',ip2long($ip));
    }
   
# ipv6
   
elseif (strpos($ip, ':') !== FALSE) {
       
$ip = explode(':', $ip);
       
$res = str_pad('', (4*(8-count($ip))), '0000', STR_PAD_LEFT);
        foreach (
$ip as $seg) {
           
$res .= str_pad($seg, 4, '0', STR_PAD_LEFT);
        }
       
$ip = pack('H'.strlen($res), $res);
    }
    return
$ip;
}
?>

ip2long> <inet_ntop
Last updated: Fri, 13 Nov 2009
 
 
show source | credits | sitemap | contact | advertising | mirror sites