Пятница , 11 Октябрь 2024
ДомойПубликациирегулярные выражения: проверка 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}$

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

Рейтинг: 0

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

2 070
не в сети 2 месяца

x64 (aka andi)

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

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

  1. Я робот!!!

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

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

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

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

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

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

    А если использовать это для набора в поле редактирования по маске.
    Я хочу набрать 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
  7. А не, пардон. Заметил, что раскладка клавиатуры на русском. Думал, что в английской раскладке и давил «.», которая не проставлялась.
    С регуляркой всё оки)

    Рейтинг: 0
  8. Если вашим примером парсить текст на наличии ip, то запись 273.156.22.100 будет отработана как 73.156.22.100 вместо того, чтобы отбросить её как некорректную

    Рейтинг: 0
    • Здравствуйте.
      Ошибаетесь smile Моя регулярка проверяет соответствие всей строки. Искать ей в тексте (убрав мету ^ и $) не возбраняется, но возможны накладки, пример Вы показали. Но! Суть в том, что обычно руководствуются принципом разумной достаточности. Что ещё может представлять тетраду чисел, разделённых точками?
      Поправить можно с помощью esc-последовательности \b в начале и конце. Но тогда не будет найдено такое: мой ip192.168.1.1
      Альтернативный вариант — проверять отсутствие цифры, хотя бы с помощью (|[^0-9]).
      Обмануть можно любой фильтр, если Вы об этом. А вот усложнять регулярку не всегда целесообразно. В данном случае ничего фатального не случится, но если попытаться охватить честной регуляркой валидный e-mail, ожидают сюрпризы.

      Рейтинг: 0

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

Политика конфиденциальности

Наш сайт использует файлы cookies, чтобы улучшить работу и повысить эффективность сайта. Продолжая работу с сайтом, вы соглашаетесь с использованием нами cookies и политикой конфиденциальности.

Принять