Я пытаюсь создать выражение регулярного выражения, которое соответствует чему-то, что не отформатировано как: ip | port.
Значение порта может быть между [1, 65535].
Примеры набора данных:
(1) 8.8.8.8 | 0 (плохо: порт 0 не разрешен)
(2) 8.8.8.8 | 1 (хорошо)
(3) 8.8.8.8 | 65536 (плохо: порт> 65535)
(4) 8.8.8.8 | дауда (плохо: символ)
Выражение регулярного выражения (соответствует неверным данным) должно соответствовать (1), (3) и (4).
Учтите, что ip часть всегда будет права (нет необходимости в регулярном выражении), и мне нужно проверить порт. Из-за этого я начал оценку к концу строки следующим образом:
Regex для соответствия порта от 0 до 65535:
\ | (6553 [0-5] | 655 [0-2] \ д | 65 [0-4] \ d {2} | 6 [0-4] \ d {3} | [1-5] \ д {4} | [1-9] \ d {0,3})
Регулярное выражение с соответствием конца строки:
\ | (6553 [0-5] | 655 [0-2] \ д | 65 [0-4] \ d {2} | 6 [0-4] \ d {3} | [1-5] \ д {4} | [1-9] \ d {0,3}) $
Теперь я хочу отрицать это, чтобы поймать строку, у которой нет действительного порта. Я смотрю на других форумах (Как отрицать конкретное слово в регулярных выражениях?, Регулярные выражения и отрицание всей группы символов) и узнайте об отрицательном предвкушении регулярных выражений.
Согласно этим форумам и отрицательному регулярному выражению, мое выражение должно быть следующим:
^ (?! (MY_REGEX)). * $
Я изменил свое регулярное выражение и добавил. * Для части ip, чтобы подключить ^.
Отрицательное регулярное выражение в конце строки:
^ (?!.\ | (6553 [0-5] | 655 [0-2] \ д | 65 [0-4] \ d {2} | 6 [0-4] \ d {3} | [1-5] \ д {4} | [1-9] \ d {0,3})).$
У меня проблема с конечной частью. * $, Которая разрешает что-то после номера порта. В конце этот код будет выполнен с PHP. В соответствии с PHP, просмотр переменной длины не поддерживается, поэтому я в первую очередь выбираю регулярное выражение.
Спасибо за помощь.
Наиболее подходящим способом является захват детали после |
с (.*)
(любые 0+ символов кроме символов разрыва строки) и проверка его с помощью небольшого количества кода PHP:
if (preg_match('~^\d+(?:\.\d+){3}\|(.*)$~', $s, $res)) {
if (ctype_digit($res[1]) && intval($res[1]) > 0 && intval($res[1]) < 65536 ) { // valid port, omit
echo "The port is valid: " . $res[1];
} else {
echo "Invalid port: " . $res[1];
}
}
ctype_digit
проверяет, содержит ли строка только цифры.
Увидеть онлайн PHP демо.
Если вам просто нужен шаблон, который будет совместим с PCRE, вы можете использовать следующий шаблон:
^\d+(?:\.\d+){3}\|(?!(?:[1-9]\d{0,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$)(.*)$
Увидеть regex demo
Смотрите подробности ниже:
^
— начало строки\d+
— 1+ цифр(?:\.\d+){3}
— 3 последовательности .
с последующими цифрами 1+ (шаблон IP, который не нуждается в проверке, считается предварительно проверенным)\|
— буквальный |
(?!(?:[1-9]\d{0,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$)
— отрицательный прогноз, который не даст совпадения, если найдет следующие числовые значения в конце строки:
[1-9]\d{0,3}
— цифра от 1
в 9
а затем от 0 до 3 цифр (1
в 9999
)[1-5]\d{4}
— цифра от 1
в 5
а потом 4 цифры (10000
в 59999
)6[0-4]\d{3}
— 6
цифра из 0
в 4
а потом 3 цифры (60000
в 64999
)65[0-4]\d{2}
— 65
цифра из 0
в 4
и 2 цифры (65000
в 65499
)655[0-2]\d
— 655
цифра из 0
в 2
и 1 цифра (65500
в 65529
)6553[0-5]
— 65530
в 65535
,(.*)
— захватить часть, которая не является допустимым портом, любые 0+ символов (кроме символов разрыва строки) до конца строки$
конец строки.Других решений пока нет …