• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • inet_pton()

    (PHP 5 >= 5.1.0, PHP 7)

    Converts a human readable IP address to its packed in_addr representation

    说明

    inet_pton(string $address): string

    This function converts a human readable IPv4 or IPv6 address (if PHP was built with IPv6 support enabled) into an address family appropriate 32bit or 128bit binary structure.

    参数

    $address

    A human readable IPv4 or IPv6 address.

    返回值

    Returns thein_addrrepresentation of the given$address,orFALSEif a syntactically invalid$addressis given (for example, an IPv4 address without dots or an IPv6 address without colons).

    范例

    Example #1inet_pton()Example

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

    更新日志

    版本说明
    5.3.0This function is now available on Windows platforms.

    参见

    • ip2long() 将 IPV4 的字符串互联网协议转换成长整型数字
    • long2ip() 将长整型转化为字符串形式带点的互联网标准格式地址(IPV4)
    • inet_ntop()Converts a packed internet address to a human readable representation
    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
    ?>
    
    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";
    }
    ?>
    
    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);
    ?>
    
    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.
    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".
    Oh my god:
    0000:0000:0000:0000:0000:0000:0127:2258
    becomes '"X.
    Do not forget to escape it
    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

    上篇:inet_ntop()

    下篇:ip2long()