О регулярных выражениях
Прошу помочь разобраться с регулярными выражениями в PHP
Имеется форма в которой пользователь вводит IP адрес (приложение из области рассчета сетей). IP может быть такого вида:
192.18.248.16
192.18.248.16/25 ("/25" - маска сети)
11000000.00010010.11111000.00010000/25
11000000.00010010.11111000.00010000
11000000.10010.11111000.10000/25
а может юзверь введет что-то неправильное типа:
1920.18.248.16.256.1024
или #$@!&^%hjkmhjlllj.
В скрипте хочу сделать разбор переданных данных с помощью регулярных выражений (может и не прав), да никак с ниси не разберусь. Может кто поделится умными мыслями на этот счет.
Заранее спасибо.
этот шаблон не совсем подходит для решения поставленной задачи т.к. он будет пропускать данные типа: 192.11011101.0.18/18 (десятичное и двоичное представление одновременно) и не удовлетворяет условию - возможен ввод IP как с маской (/18) так и без нее.
Не без помощи умных людей составил такое:
if(@ereg("^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})(\/([0-9]{1,2}))?$", $date, $regs)) {
echo "$regs[1].$regs[2].$regs[3].$regs[4]";
if($regs[6]<>"") echo "/$regs[6]";
}elseif(@ereg("^([01]{1,8})\.([01]{1,8})\.([01]{1,8})\.([01]{1,8})(\/([0-9]{1,2}))?$", $date, $regs)){
echo "$regs[1].$regs[2].$regs[3].$regs[4]";
if($regs[6]<>"") echo "/$regs[6]";
}else{
echo 'Хрена лысого';
}
это вроде удовлетворяет задаче.
====
Может теперь кто поможет оптимизировать
192.168.10101010.14 - нормальный ип :D
(
([0-9]{1,2}|([01][0-9]{2})|([2][0-5][0-9]))\.
){3}([0-9]{1,2}|([01][0-9]{2})|([2][0-5][0-9]))
)|
(
([01]{1,8}\.){3}[01]{1,8}
)
Должно работать... Только он без маски, маску сам как нить... И переносы убери, я их поставил чтобы читать легче было
хехб опередили
да нихрена ни удовлетворяет - 666.666.666.666 - нормальный ип?
да и в моем можно 259 протащить. Где то валялась эта регулярка, нарою - закину...
Так устраивает? Читабельности, правда, мало. :)
else echo "малацца мужик - IP верный";
Ну а обработку всего остального хозяйства (вроде маски сети) добавить не проблема
ip2long() should not be used as the sole form of IP validation. Combine it with long2ip():
Пример 3. IP validation
<?php
// make sure IPs are valid. also converts a non-complete IP into
// a proper dotted quad as explained below.
$ip = long2ip(ip2long("127.0.0.1")); // "127.0.0.1"
$ip = long2ip(ip2long("10.0.0")); // "10.0.0.0"
$ip = long2ip(ip2long("10.0.256")); // "10.0.1.0"
?>
Форматирует в полный IP
Да и судя по приведённому Proger_XP отрывку, валидация будет не совсем той, что требуется, т.к. ip2long может принять не 4 "байта", а меньше. Как я понял, intro-nikol требуется, чтобы человек всегда воодил все четыре части.
Хотя, если разобраться и немного подумать, то можно сделать код, который будет учитывать и это.
Что получилось здесь -> http://nikol.xost.ru/ipcalc.php
====
Есть еще интересная тема по поводу классов в PHP - оформление в виде классов скрипта по формированию 3D секторной диаграммы (типа 3D Piechart из ChartDirector) Пример работы скрипта http://nikol.xost.ru/piechart.php