Как оценить IP?

Как я могу определить, является ли строка IP-адресом? Либо IPv4, либо IPv6?

Какое наименьшее и наибольшее количество символов?

Я предполагаю, что это будет ответ регулярное выражение.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
2 991
6

Ответы 6

Для IPv4 вы можете использовать это регулярное выражение.

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Это выглядит довольно сложно, но работает, ограничивая каждую четверку числами от 0 до 255.

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

Что-то вроде этого:

bool IsValidIPAddress(string possibleIP){
  CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b
  return Regex.Match(possibleIP+'.', CrazyRegex)
}

@unsliced, это правильно, но это, конечно, будет зависеть от реализации, если вы разбираете IP-адрес пользователя, посещающего ваш сайт, тогда вы можете использовать регулярное выражение, поскольку оно ДОЛЖНО быть в формате x.x.x.x.

Для IPv6 вы можете использовать это

[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}

однако он не улавливает все, потому что с IPv6 это намного сложнее, согласно Википедии, все следующие примеры технически верны, однако регулярное выражение выше будет улавливать только те, которые имеют *

2001:0db8:0000:0000:0000:0000:1428:57ab*
2001:0db8:0000:0000:0000::1428:57ab*
2001:0db8:0:0:0:0:1428:57ab*
2001:0db8:0:0::1428:57ab
2001:0db8::1428:57ab
2001:db8::1428:57ab

В .NET есть тип IPAddress, который имеет удобный метод TryParse.

Пример:

if (System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
    //validatedIPAddress is good
}

// or more simply:
bool IsValidIPAddress(string possibleIP){
    return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}

Я делал это раньше, но мне нравится пост Раймонда Чена по адресу:

http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

Где он в основном выступает за использование регулярных выражений для того, в чем они хороши: для анализа токенов. Затем оцените результаты. Его пример:

function isDottedIPv4(s)
{
 var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
 return match != null &&
        match[1] <= 255 && match[2] <= 255 &&
        match[3] <= 255 && match[4] <= 255;
}

Гораздо проще посмотреть на это и понять, что он должен делать.

Я тестировал его на разных входах. Кажется пуленепробиваемым.

Milan Babuškov 25.04.2014 13:31

IPv4 становится: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

Я не уверен в правилах IPv6.

Другие вопросы по теме