Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

О регулярных выражениях

13K
30 января 2007 года
intro-nikol
17 / / 27.04.2006
Доброго времени суток.
Прошу помочь разобраться с регулярными выражениями в 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.
В скрипте хочу сделать разбор переданных данных с помощью регулярных выражений (может и не прав), да никак с ниси не разберусь. Может кто поделится умными мыслями на этот счет.
Заранее спасибо.
11K
30 января 2007 года
.nornad
125 / / 04.01.2007
Сам шаблон рег.выражения для указанных форматов адресов будет таким:
 
Код:
(\d{1,3}|[01]{1,8})([.]\d{1,3}|[01]{1,8}){3}(/\d{1,3}|[01]{1,8})
13K
30 января 2007 года
intro-nikol
17 / / 27.04.2006
Цитата: .nornad
Сам шаблон рег.выражения для указанных форматов адресов будет таким:
 
Код:
(\d{1,3}|[01]{1,8})([.]\d{1,3}|[01]{1,8}){3}(/\d{1,3}|[01]{1,8})


этот шаблон не совсем подходит для решения поставленной задачи т.к. он будет пропускать данные типа: 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 'Хрена лысого';
}

это вроде удовлетворяет задаче.

====
Может теперь кто поможет оптимизировать

338
30 января 2007 года
chigevara
529 / / 29.09.2003
Цитата: .nornad
Сам шаблон рег.выражения для указанных форматов адресов будет таким:
 
Код:
(\d{1,3}|[01]{1,8})([.]\d{1,3}|[01]{1,8}){3}(/\d{1,3}|[01]{1,8})



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 протащить. Где то валялась эта регулярка, нарою - закину...
11K
31 января 2007 года
.nornad
125 / / 04.01.2007
 
Код:
((\d{1,3}([.]\d{1,3}){3})|([01]{1,8}([.][01]{1,8}){3}))(/\d{1,3})?
Это шаблон для либо только десятичного представления, либо только для двоичного. Маска подсети всегда только в десятичном виде. Маска подсети либо присутствует, либо отсутствует.
11K
31 января 2007 года
.nornad
125 / / 04.01.2007
Можно, конечно, ещё сильнее извратиться и определить вообще шаблон под 255.255.255.255/255:
 
Код:
(((1?\d{1,2})|(2(([0-4]\d)|(5[0-5]))))([.]((1?\d{1,2})|(2(([0-4]\d)|(5[0-5]))))){3}(/((1?\d{1,2})|(2(([0-4]\d)|(5[0-5])))))?)|([01]{1,8}([.][01]{1,8}){3}(/[01]{1,8})?)

Так устраивает? Читабельности, правда, мало. :)
253
31 января 2007 года
Proger_XP
1.5K / / 07.08.2004
А почему нельзя проверять простым выражением, а потом через if?
13
31 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Сколько проблем-то!!! И никто не посмотрел в сторону самого простого варианта

 
Код:
if(ip2long($ip)==-1) echo "Ваш IP введен криво";
else echo "малацца мужик - IP верный";


Ну а обработку всего остального хозяйства (вроде маски сети) добавить не проблема
253
31 января 2007 года
Proger_XP
1.5K / / 07.08.2004
Хех... Из доков:
Цитата:

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

11K
31 января 2007 года
.nornad
125 / / 04.01.2007
Ну, вопрос был в том, как проверить айпишник с помощью рег.выражений, потому и играемся с ними. :) Штука-то интересная ;)
Да и судя по приведённому Proger_XP отрывку, валидация будет не совсем той, что требуется, т.к. ip2long может принять не 4 "байта", а меньше. Как я понял, intro-nikol требуется, чтобы человек всегда воодил все четыре части.
Хотя, если разобраться и немного подумать, то можно сделать код, который будет учитывать и это.
253
31 января 2007 года
Proger_XP
1.5K / / 07.08.2004
Можно сначала проверять методом из доков, выводить юзеру на экран и спрашивать, это ли то что он имел ввиду. Если да - все ок, если нет - посылать куда-нить к докам
13K
02 февраля 2007 года
intro-nikol
17 / / 27.04.2006
Данный вопрос возник при написании скрипта для IP калькулятора. Необходимо контролировать "кривые" данные, введенные пользователем, типа смеси из десятиричных и двоичных значений. Предполагается, что пользователь поверхностно знаком с форматом записи IP адреса.
Что получилось здесь -> http://nikol.xost.ru/ipcalc.php

====
Есть еще интересная тема по поводу классов в PHP - оформление в виде классов скрипта по формированию 3D секторной диаграммы (типа 3D Piechart из ChartDirector) Пример работы скрипта http://nikol.xost.ru/piechart.php
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог