|
|
|
| Цель алгоритма:
В поле формы вводиться диапазон IP адресов, следующим образом:
192.168.5-7,90.123,125-127,130
(запятая означает разовые значения поля адреса, тире означает диапазон с ... по.)
данная строка трактуется как 20 IP адресов:
192.168.5.123
192.168.5.125
192.168.5.126
192.168.5.127
192.168.5.130
192.168.6.123
192.168.6.125
192.168.6.126
192.168.6.127
192.168.6.130
192.168.7.123
192.168.7.125
192.168.7.126
192.168.7.127
192.168.7.130
192.168.90.123
192.168.90.125
192.168.90.126
192.168.90.127
192.168.90.130
Мое решение:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Добавить пользователя</title>
<style type="text/css">
<!--
input, select
{
position:absolute;
left:120px;
width:145px;
}
.submit, .sel
{
width:150px;
}
-->
</style></head>
<body>
<?php if(!isset($_POST['submit'])) {?>
<!-- Форма добавления пользователя -->
<form id="authorization" action="adduser.php" method="POST">
<label>Диапазон IP:
<input name="ip" type="text" value="" />
</labe>
<br />
<br />
<input class="submit" name="submit" type="submit" value="Ok" />
</form>
<?php
}
else
{
extract($_POST);
$level1 = ".";
$level2 = ",";
$level3 = "-";
$range_l1 = explode($level1, $ip);
$count_l1 = count($range_l1);
$a = 0;
for($i=0;$i<$count_l1;$i++)
{
$range_l2 = explode($level2, $range_l1[$i]);
if(!empty($range_l2[1]))
{
$count_l2 = count($range_l2);
for($j=0;$j<$count_l2;$j++)
{
$range_l3 = explode($level3, $range_l2[$j]);
if(!empty($range_l3[1]))
{
for($k=$range_l3[0];$k<=$range_l3[1];$k++)
{
$ips[$i][$a] = $k;
$a++;
}
}
else
{
$ips[$i][$a] = $range_l2[$j];
$a++;
}
}
}
else
{
$ips[$i][$a] = $range_l1[$i];
$a++;
}
$a = 0;
}
for($i=0;$i<4;$i++)
{
$count[$i] = count($ips[$i]);
}
for($i=0;$i<$count[0];$i++)
{
for($j=0;$j<$count[1];$j++)
{
for($k=0;$k<$count[2];$k++)
{
for($x=0;$x<$count[3];$x++)
{
echo $ips[0][$i].".".$ips[1][$j].".".$ips[2][$k].".".$ips[3][$x]."<br />\n";
$fff++;
}
}
}
}
}
?>
<!-- Конец -->
</body>
</html>
|
что можно сделать чтобы упростить данный скрипт??? | |
|
|
|
|
|
|
|
для: kaoz
(05.06.2006 в 17:37)
| | А зачем? Он что, плохо работает? Или медленно? | |
|
|
|
|
|
|
|
для: Саня
(05.06.2006 в 19:39)
| | большой слишком... чувствую что можно проще сделать, но ничего в голову пока не приходит.. может у кого мысли есть? | |
|
|
|
|
|
|
|
для: kaoz
(06.06.2006 в 08:19)
| | Я бы переводил ip адреса в число и уже затем сравнивал. В итоге скрипт сократится до нескольких строчек. | |
|
|
|
|
|
|
|
для: Loki
(06.06.2006 в 09:40)
| | ????
Вы не могли бы попобробнее объяснить?? | |
|
|
|
|
|
|
|
для: kaoz
(06.06.2006 в 09:47)
| | нашел в скрипте ошибку
если вводить без запятых диапазон, то тогда диапазон не разбирается..
вообщем модернизировал следующим образом:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Добавить пользователя</title>
<style type="text/css">
<!--
input
{
position:absolute;
left:120px;
width:145px;
}
.submit
{
width:150px;
}
#border
{
background-color : #EEEEEE;
border-width : 1px;
border-color : #000000;
border-style : dashed;
padding-top : 10px;
padding-bottom : 10px;
padding-left : 10px;
padding-right : 10px;
}
-->
</style></head>
<body>
<?php
if(!empty($_POST['submit']))
{
extract($_POST);
$level1 = ".";
$level2 = ",";
$level3 = "-";
$range_l1 = explode($level1, $ip);
$count_l1 = count($range_l1);
$a = 0;
for($i=0;$i<$count_l1;$i++)
{
$range_l2 = explode($level2, $range_l1[$i]);
// if(!empty($range_l2[1]))
// {
$count_l2 = count($range_l2);
for($j=0;$j<$count_l2;$j++)
{
$range_l3 = explode($level3, $range_l2[$j]);
if(!empty($range_l3[1]))
{
for($k=$range_l3[0];$k<=$range_l3[1];$k++)
{
$ips[$i][$a] = $k;
$a++;
}
}
else
{
$ips[$i][$a] = $range_l2[$j];
$a++;
}
}
// }
// else
// {
// $ips[$i][$a] = $range_l1[$i];
// $a++;
// }
$a = 0;
}
for($i=0;$i<4;$i++)
{
$count[$i] = count($ips[$i]);
}
echo "<div id=\"border\">\n";
$fff = 0;
for($i=0;$i<$count[0];$i++)
{
for($j=0;$j<$count[1];$j++)
{
for($k=0;$k<$count[2];$k++)
{
echo " <div id=\"col_$k\">\n";
for($x=0;$x<$count[3];$x++)
{
echo " ".$ips[0][$i].".".$ips[1][$j].".".$ips[2][$k].".".$ips[3][$x]."<br />\n";
$fff++;
}
echo " </div>\n";
}
}
}
echo "</div>\n";
}
?>
<!-- Форма добавления пользователя -->
<form id="authorization" action="adduser.php" method="POST">
<label>Диапазон IP:
<input name="ip" type="text" value="" />
</labe>
<br />
<br />
<input class="submit" name="submit" type="submit" value="Ok" />
</form>
<!-- Конец -->
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: kaoz
(06.06.2006 в 09:50)
| |
<?
function r2s($list)
{
$s = array();
foreach(explode(',',$list) as $el)
{
$b = explode('-', $el);
if(!isset($b[1])) $b[1] = $b[0];
list($p, $q) = $b;
while($p <= $q) $s[] = intval($p++);
}
return $s;
}
$ip="192.168.5-7,90.123,125-127,130";
$res = array();
for($r1 = explode('.', $ip), $i = count($r1); --$i >= 0;)
{
if(empty($res))
foreach(r2s($r1[$i]) as $v)
$res[] = "$v";
else
{
$s = array();
foreach(r2s($r1[$i]) as $v)
foreach($res as $w)
$s[] = "$v.$w";
$res = $s;
}
}
foreach($res as $v)
echo "$v<br>";
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(06.06.2006 в 10:54)
| | вы не могли бы прокомментировать? | |
|
|
|
|
|
|
|
для: kaoz
(06.06.2006 в 11:17)
| | Функция r2s преобразует запись списка диапазонов (т.е. строку вида '1,3-6,8' ) в множество чисел (т.е. array(1,3,4,5,6,8) )
Цикл ниже строит соединения этих множеств. | |
|
|
|
|
|
|
|
для: kaoz
(06.06.2006 в 11:17)
| |
<?
function ip_to_val($ip)
{
$tmp=explode(".", $ip);
$val=256*256*256*$tmp[0]+256*256*$tmp[1]+256*$tmp[2]+$tmp[3];
return $val;
}
$ip="195.200.200.9";
$diapazon="195.200.200.0-195.200.200.255";
list($begin_ip, $end_ip)=explode("-", $diapazon);
if (ip_to_val($begin_ip)<=ip_to_val($ip) && ip_to_val($end_ip)>=ip_to_val($ip))
echo "ip попадает в указанный диапазон";
|
| |
|
|
|
|
|
|
|
для: Loki
(06.06.2006 в 13:34)
| | крута, спасибо за помощь... | |
|
|
|