За последние 24 часа нас посетили 15613 программистов и 1538 роботов. Сейчас ищут 807 программистов ...

Айпи перевести в нужный формат

Тема в разделе "PHP для новичков", создана пользователем inline, 27 дек 2011.

  1. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    Есть БД айпи в формате nginx map
    как средствами пхп перевести в формат
    спасибо!
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Информации, подобной этой
    в айпишниках не содержится.
     
  3. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    2.0.0.0/12 223;

    например
    2.0.0.0/12 - это записан диапазон айпишников
    37393408 - 37394431 - это тоже диапазон айпишников, но в другом формате

    как с формата 2.0.0.0/12 перевести в 37393408 - 37394431 средствами (стандартной может быть функцией)?

    как правильно назваются эти форматы?
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    А.
    http://php.net/ip2long
    обработай крайние айпишники - получишь диапазон.
    Только MSK это или RU естественно надо брать из готовых баз
     
  5. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    первый крайний понятно, а последний как узнать средствами пхп? по входной инфе 2.0.0.0/12 ?
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ну считай, это маска 255.240.0.0
     
  7. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    как считать?
    я не совсем в курсе

    может есть стандартная функция пхп для этого дела?
     
  8. ss64

    ss64 Активный пользователь

    С нами с:
    25 мар 2010
    Сообщения:
    35
    Симпатии:
    0
    Вот у меня что то эдакое получилось, оно?

    Метод "маск", высчитывает последний ип в диапазоне, что означают цифры после пробела - хз поэтому просто потёр.


    Код (Text):
    1. <?php
    2.  
    3. $list = '
    4. 2.0.0.0/12 223;
    5. 2.16.6.0/23 61;
    6. 2.16.68.0/23 234;
    7. 2.16.70.0/23 88;
    8. 2.16.132.0/23 61;
    9. 2.16.170.0/23 61;
    10. 2.16.172.0/23 61;
    11. 2.16.178.0/23 66;
    12. ';
    13.  
    14. $list = explode(PHP_EOL,trim($list));
    15.  
    16. foreach($list as $str){
    17.     $str    = DeleteAfter($str,' ');
    18.     $ip = DeleteAfter($str,'/');
    19.     $mask   = (int)DeleteBefore($str,'/');
    20.     $ip_start   = ip2long($ip);
    21.     $max    = mask($ip,$mask);
    22.    
    23.     echo '<b>'.$ip.'</b> === '.long2ip($max).'<br/>';
    24.     echo $ip_start.' === '.$max.'<br/><br/>';
    25. }
    26.  
    27.     function mask($ip,$mask){
    28.         $ip = ip2long($ip);
    29.         $flag = 1;
    30.         for($i=0;$i<$mask;$i++){
    31.             $ip = $ip | $flag;
    32.             $flag <<= 1; //Двигаем биты
    33.         }
    34.         return $ip;
    35.     }
    36.  
    37.     function DeleteAfter($str,$marker,$mode=false){
    38.         $pos = strpos($str,$marker);
    39.         if($pos!==false)
    40.             if($mode)
    41.                 return substr($str,0,$pos+strlen($marker));
    42.             else
    43.                 return substr($str,0,$pos);
    44.         return $str;
    45.     }
    46.     function DeleteBefore($str,$marker,$mode=false){
    47.         $pos = strpos($str,$marker);
    48.         if($pos!==false)
    49.             if($mode)
    50.                 return substr($str,$pos);
    51.             else
    52.                 return substr($str,$pos+strlen($marker));
    53.         return $str;
    54.     }
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Стандартных функций нету. Гугли по "маска подсети".
     
  10. ss64

    ss64 Активный пользователь

    С нами с:
    25 мар 2010
    Сообщения:
    35
    Симпатии:
    0
    А чем мой метод не подходит? Уже готовое решение :)
     
  11. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    Re:

    уверены что он правильно работает
    вот результат
    2.0.0.0 === 2.0.15.255
    33554432 === 33558527

    2.16.6.0 === 2.127.255.255
    34604544 === 41943039

    2.16.68.0 === 2.127.255.255
    34620416 === 41943039

    2.16.70.0 === 2.127.255.255
    34620928 === 41943039

    2.16.132.0 === 2.127.255.255
    34636800 === 41943039

    2.16.170.0 === 2.127.255.255
    34646528 === 41943039

    2.16.172.0 === 2.127.255.255
    34647040 === 41943039

    2.16.178.0 === 2.127.255.255
    34648576 === 41943039

    все кроме первого концовка 41943039
     
  12. asokol

    asokol Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    inline, последняя цифра в "2.0.0.0/12 223" и есть регион или город.

    Если Вам надо только по России, то Вы не пробовали взять актуальную базу, например, на http://ipgeobase.ru/?

    DeleteAfter и DeleteBefore можно заменить на explode, и получить обе нужные строки сразу.

    Операции по вычислению верхнего предела лучше в двоичной системе производить.
     
  13. inline

    inline Активный пользователь

    С нами с:
    21 май 2010
    Сообщения:
    466
    Симпатии:
    0
    меня интересует правильно ли так
    function mask($ip,$mask){
    $ip = ip2long($ip);
    $flag = 1;
    for($i=0;$i<$mask;$i++){
    $ip = $ip | $flag;
    $flag <<= 1; //Двигаем биты
    }
    return $ip;
    }

    подсчитано верхний предел?