Среда , 18 Январь 2017
Конкурс «Книга за вопрос»
ДомойПубликациирегулярные выражения: проверка ip на корректность

регулярные выражения: проверка ip на корректность

проверка ip на корректность

существует, казалось бы, тривиальная задача: с помощью регулярного выражения проверить корректность введённого ip. на ум приходят сразу 2 варианта:


^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$

^\\d{1,3}\.\\d{1,3}\.\\d{1,3}\.\\d{1,3}$

правда, оба не лишены недостатков. каких? для начала определим, что есть ip? это некий уникальный адрес узла в сети, по которому можно однозначно идентифицировать данный узел. в машинном виде адрес представляет собой обычное 4-байтовое число, что неудобно для записи человеком. поэтому была принята запись, вида AAA.BBB.CCC.DDD, значения байтов записываются через точку (байт состоит из 8 битов, каждый из которых может принимать значение 0 или 1. таким образом, максимально возможное число вариантов 28, чему соответствует 256 разных значений — от 0 до 255 включительно в десятичном виде, или от 00 до FF в шестнадцетиричном). итого: диапазон всех адресов лежит в пределах 0.0.0.0 и 255.255.255.255.

если вернуться к написанным выше регулярным выражениям, убеждаемся, что любой из указанных в предыдущем абзаце адресов проверку проходит. правда, пройдут проверку и 256.256.256.256, и 999.999.999.999 (которые, хотя по структуре и похожи, ip-адресами не являются). таким образом, нужно как-то ограничить максимальные значения. однако стоит учесть, что следующий адрес 001.020.130.240 также является корректным (т. к. начальные нули не учитываются). ну и, наконец, коли уж ip соотоит из 4-ёх чисел в диапазоне 0–255, разделённых точкой, для начала можно составить регулярное выражение для одной секции, после чего повторить его 4 раза. код секции будет таким:


(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[0-9]{2}|[0-9])

если разобрать каждую из возможных частей, получим следующие диапазоны значений:

25[0-5]
250–255
2[0-4][0-9]
200–249
[0-1][0-9]{2}
000–199
[0-9]{2}
00–99
[0-9]
0–9

таким образом, данное регулярное выражение описывает все возможные комбинации записи одной секции ip-адреса (одного байта). полный же код будет таким:


^(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[0-9]{2}|[0-9])(\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[0-9]{2}|[0-9])){3}$

отсюда можно скопировать готовый код для вставки в скрипт:

Поддержать проект

WebMoney

Яндекс.Деньги


Рейтинг: 0

Автор публикации

1 203
не в сети 51 минута

x64 (aka andi)

Комментарии: 1846Публикации: 303Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (4 голосов, в среднем: 4,75 из 5)
Загрузка...

10 комментариев

  1. Я робот!!!

    Рейтинг: 0
  2. поздравляю

    Рейтинг: 0
  3. Спасибо.

    Рейтинг: 0
  4. А что, Заглавные буквы уже отменили?! Вообще обалдели, неграмотность зашкаливает!

    Рейтинг: 0
  5. Мне кажется, можно упростить до /^(25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3}$/

    Рейтинг: 0
  6. Хайзенберг

    спасибо за пример!
    пол ночи уже ломаю мозг как фильтровать диапазоны IP адресов, и наконец-то у вас нашел рабочее решение.
    каменты доставили массу удовольствия, не смог пройти мимо и не отметиться )

    Рейтинг: 0
  7. Добрый день

    А если использовать это для набора в поле редактирования по маске.
    Я хочу набрать 192.168.1.10
    Мне даёт эта регулярка набрать 192.168.001.010, что не очень представительно

    Рейтинг: 0
    • Алекс, здравствуйте.
      Регулярка составлялась и для вариантов с ведущими нулями. Если этого не требуется, то из 000–199 и 00–99 исключить ведущие нули.
      Т. е., полновесная триада приобретает вид:
      25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]

      Рейтинг: 0
  8. А не, пардон. Заметил, что раскладка клавиатуры на русском. Думал, что в английской раскладке и давил «.», которая не проставлялась.
    С регуляркой всё оки)

    Рейтинг: 0

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

Ваш email не будет опубликован.Необходимы поля отмечены *

*

Добавьте изображение (jpg/gif/png)

Авторизация

Регистрация

Пароль не введен

Генерация пароля