Существует, казалось бы, тривиальная задача: с помощью регулярного выражения проверить корректность введённого 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}$
Отсюда можно скопировать готовый код для вставки в скрипт:
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости
продлением хостинга на +1 месяц
Я робот!!!
поздравляю
Спасибо.
А что, Заглавные буквы уже отменили?! Вообще обалдели, неграмотность зашкаливает!
Фразу «заглавные буквы» нужно писать с маленькой. Да, неграмотность сплошь и рядом, что очень огорчает.
Мне кажется, можно упростить до /^(25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3}$/
спасибо за пример!
пол ночи уже ломаю мозг как фильтровать диапазоны IP адресов, и наконец-то у вас нашел рабочее решение.
каменты доставили массу удовольствия, не смог пройти мимо и не отметиться )
Добрый день
А если использовать это для набора в поле редактирования по маске.
Я хочу набрать 192.168.1.10
Мне даёт эта регулярка набрать 192.168.001.010, что не очень представительно
Алекс, здравствуйте.
Регулярка составлялась и для вариантов с ведущими нулями. Если этого не требуется, то из 000–199 и 00–99 исключить ведущие нули.
Т. е., полновесная триада приобретает вид:
25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]
А не, пардон. Заметил, что раскладка клавиатуры на русском. Думал, что в английской раскладке и давил «.», которая не проставлялась.
С регуляркой всё оки)
Если вашим примером парсить текст на наличии ip, то запись 273.156.22.100 будет отработана как 73.156.22.100 вместо того, чтобы отбросить её как некорректную
Здравствуйте.
Ошибаетесь Моя регулярка проверяет соответствие всей строки. Искать ей в тексте (убрав мету ^ и $) не возбраняется, но возможны накладки, пример Вы показали. Но! Суть в том, что обычно руководствуются принципом разумной достаточности. Что ещё может представлять тетраду чисел, разделённых точками?
Поправить можно с помощью esc-последовательности \b в начале и конце. Но тогда не будет найдено такое: мой ip192.168.1.1
Альтернативный вариант — проверять отсутствие цифры, хотя бы с помощью (|[^0-9]).
Обмануть можно любой фильтр, если Вы об этом. А вот усложнять регулярку не всегда целесообразно. В данном случае ничего фатального не случится, но если попытаться охватить честной регуляркой валидный e-mail, ожидают сюрпризы.