Во-первых, давайте поговорим о регулярном выражении .Тогда алгоритм мы могли бы использовать.
Регулярные выражения и IP
(Примечание: регулярные выражения IP получены из Regular-expressions.info -Как найти или проверить IP-адрес .)
Полное регулярное выражение для IP-адреса может быть:
^(?:(?: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]?)$
Вы можетеобратите внимание, что три первых байта проверяются одним и тем же шаблоном ниже (в окружении ^
и $
):
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)$
Четвертый байт отличается:
^(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Простой алгоритм
(Примечание: я рассматриваю только событие keypress
.)
Поскольку IP проверяется постепенно , мы можем предположить при каждой проверке, что деталь является уже правильной .
Алгоритм будет, длякаждое нажатие клавиши :
- Получить * * * * * * * * * * * * * * * введенных байтов , разделенных точкой
.
- Если массив содержит больше чем foПри вводе данных пользователь вводит дополнительную точку после действительного IP, ввод отклоняется, return
false
- Если байт предпоследний пустой строка , пользователь попытался ввести вторую точку , ввод отклонен, возврат
false
- Если последний байт пустая строка , это нормально, потому что пользователь просто ввел точку , return
true
- Последний байт 1089 * не пусто, давайте проверим это с помощью соответствующего регулярного выражения;если он соответствует регулярному выражению, то return
true
else return false
.
Ниже рабочего фрагмента вы можете адаптироваться.
var first3BytesRg = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$/;
var fourthByteRg = /^(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
document.getElementById("ip").onkeypress = preventInvalid;
function preventInvalid(e) {
return validateIP(e.target.value + String.fromCharCode(e.which));
}
function validateIP(ip) {
var splitted = ip.split(".");
var nb = splitted.length;
if (nb > 4) return false;
if (splitted[nb - 2] == "") return false;
if (splitted[nb - 1] == "") return true;
if (nb < 4) {
return first3BytesRg.test(splitted[nb - 1]);
}
return fourthByteRg.test(splitted[nb - 1]);
}
IP <input type="text" id="ip" />