Показать сообщение отдельно

  #2  
Старый 15.03.2010, 09:11
prescott
Участник форума
Регистрация: 28.07.2008
Сообщений: 158
Провел на форуме:
728470

Репутация: 115
По умолчанию

Маска такого вида не определяет диапазон типа 83.151.0.0 - 83.151.0.20

Вот нашел более менее понятное объяснение алгоритма расчета маски: http://www.cap-design.ru/ksptp/5_2_4.php,
а вот и функция, похожая на верную:
PHP код:
function Check_Ip($Ip_For_Search$Allow_Ip_Range)
{
    
$ip_count = array(32=>031=>130=>329=>728=>1527=>3126=>6325=>12724=>25523=>51122=>102321=>204720=>4095,
                      
19=>819118=>1638317=>3276716=>6553515=>13107114=>26214313=>52428712=>104857511=>2097151,
                      
10=>41943039=>83886078=>167772157=>335544316=>671088635=>1342177274=>2684354553=>536870911,
                      
2=>1073741823);
   
    
$Ip_For_Search_Converted ip2long($Ip_For_Search);
    
$Result FALSE;
    foreach ( 
$Allow_Ip_Range as $Value )
    {
      list(
$ip$prefix)                    = preg_split('/\//',$Value);
      
$Range_Start ip2long($ip);
      
$Range_End   $Range_Start $ip_count["$prefix"];
      echo 
"";
      if ( 
$Ip_For_Search_Converted >= $Range_Start && $Ip_For_Search_Converted <= $Range_End )
      {
        return 
TRUE;
      }
    }
    return 
$Result;

 
Ответить с цитированием