IP-адрес — это строка со строгой структурой, состоящая из числовых блоков, разделённых точками. Формат IPv4 включает четыре октета:
192.168.0.1
Каждый блок содержит число от 0 до 255.
Простая текстовая проверка недостаточна, поскольку строка
999.999.999.999 формально соответствует шаблону
число.число.число.число, но не является корректным
IP-адресом.
Библиотека Inputmask позволяет:
Базовая маска может быть построена через цифровые плейсхолдеры:
<input id="ip">
Inputmask("999.999.999.999").mask("#ip");
Такая маска:
Пример:
192.168.001.100
Недостаток такого подхода — отсутствие проверки диапазона
0–255.
Например:
999.999.999.999
будет считаться валидным вводом.
Для полноценной проверки необходимо использовать регулярные выражения или кастомные определения.
Наиболее распространённый шаблон IPv4:
(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)
Он описывает:
| Шаблон | Значение |
|---|---|
25[0-5] |
250–255 |
2[0-4]\d |
200–249 |
1\d\d |
100–199 |
[1-9]?\d |
0–99 |
Inputmask поддерживает режим регулярных выражений.
Inputmask({
regex: "((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})"
}).mask("#ip");
Корректные значения:
127.0.0.1
192.168.1.10
255.255.255.255
Некорректные значения:
256.1.1.1
999.0.0.1
300.400.500.600
Inputmask содержит встроенный alias для IP-адресов.
Inputmask("ip").mask("#ip");
Это наиболее удобный вариант.
Особенности alias:
Пример работы:
192.168.0.1
Попытка ввести:
300
в одном октете будет отклонена.
Alias поддерживает дополнительные параметры.
Inputmask("ip", {
clearIncomplete: true
}).mask("#ip");
Если пользователь оставил адрес незавершённым:
192.168.
поле будет очищено.
Inputmask("ip", {
autoUnmask: true
}).mask("#ip");
При получении значения:
input.value
возвращается чистый IP без внутренних служебных символов.
Inputmask("ip", {
placeholder: "_"
}).mask("#ip");
Результат:
___.___.___.___
const value = document.getElementById("ip").value;
Пример:
192.168.0.1
const value = document.getElementById("ip").inputmask.unmaskedvalue();
Для IP результат обычно совпадает:
192.168.0.1
Inputmask предоставляет метод проверки.
const valid = Inputmask.isValid(
"192.168.1.1",
{
alias: "ip"
}
);
console.log(valid);
Результат:
true
const valid = Inputmask.isValid(
"999.999.999.999",
{
alias: "ip"
}
);
console.log(valid);
Результат:
false
Метод isComplete() определяет, завершён ли ввод.
const complete = document
.getElementById("ip")
.inputmask
.isComplete();
console.log(complete);
Для:
192.168.1.
результат:
false
Inputmask("ip", {
oncomplete: function () {
console.log("IP введён полностью");
}
}).mask("#ip");
Inputmask("ip", {
onincomplete: function () {
console.log("Адрес не завершён");
}
}).mask("#ip");
Inputmask("ip", {
onKeyValidation: function (key, result) {
console.log(key, result);
}
}).mask("#ip");
Иногда требуется запретить:
Стандартный IP допускает:
001.001.001.001
Но многие интерфейсы требуют:
1.1.1.1
Можно использовать regex:
Inputmask({
regex: "((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])"
}).mask("#ip");
Пример диапазона:
192.168.x.x
Маска:
Inputmask({
regex: "192\\.168\\.(25[0-5]|2[0-4][0-9]|[0-9]{1,2})\\.(25[0-5]|2[0-4][0-9]|[0-9]{1,2})"
}).mask("#ip");
IPv6 имеет совершенно другой формат:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
Inputmask не содержит полноценного встроенного alias IPv6, поэтому обычно используется regex.
Inputmask({
regex: "[0-9a-fA-F:]{2,39}"
}).mask("#ipv6");
Такая проверка является упрощённой.
Inputmask({
regex: "([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}"
}).mask("#ipv6");
Корректный пример:
fe80:0000:0000:0000:0202:b3ff:fe1e:8329
IPv6 допускает сокращения:
::1
fe80::1
Полноценное регулярное выражение становится крайне сложным.
В таких случаях обычно применяют:
Inputmask поддерживает динамические маски.
Inputmask({
mask: [
{
alias: "ip"
},
{
regex: "[0-9a-fA-F:]{2,39}"
}
],
keepStatic: false
}).mask("#address");
Поле сможет принимать:
192.168.0.1
и:
fe80::1
Часто адрес вводится вместе с портом:
192.168.0.1:8080
Inputmask({
regex: "((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2}):([0-9]{1,5})"
}).mask("#ipport");
Корректный диапазон порта:
0–65535
Regex для порта:
6553[0-5]
|655[0-2][0-9]
|65[0-4][0-9]{2}
|6[0-4][0-9]{3}
|[1-5][0-9]{4}
|[0-9]{1,4}
Полная маска:
Inputmask({
regex:
"((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})\\.){3}" +
"(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})" +
":" +
"(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[0-9]{1,4})"
}).mask("#ipport");
CIDR-запись:
192.168.0.0/24
Inputmask({
regex:
"((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})\\.){3}" +
"(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})" +
"\\/" +
"(3[0-2]|[12]?[0-9])"
}).mask("#cidr");
Корректные значения:
10.0.0.0/8
192.168.0.0/24
172.16.0.0/16
Сложные регулярные выражения для IP:
Наиболее производительный вариант:
Inputmask("ip")
Regex рекомендуется использовать только при нестандартных требованиях.
form.addEventListener("submit", function (event) {
const valid = document
.getElementById("ip")
.inputmask
.isComplete();
if (!valid) {
event.preventDefault();
}
});
import Inputmask from "inputmask";
import { useEffect, useRef } from "react";
function App() {
const ref = useRef(null);
useEffect(() => {
Inputmask("ip").mask(ref.current);
}, []);
return <input ref={ref} />;
}
mounted() {
Inputmask("ip").mask(this.$refs.ip);
}
<input ref="ip">
ngAfterViewInit(): void {
Inputmask("ip").mask(
this.ipInput.nativeElement
);
}
Ошибка:
Inputmask("999.999.999.999")
Проблема:
999.999.999.999
считается валидным.
Огромные выражения:
^((([0-9A-Fa-f]{1,4}:){7}...
могут:
Inputmask — клиентский инструмент.
Он:
Но окончательная проверка IP должна выполняться на сервере.
<form id="networkForm">
<input id="ip">
<button type="submit">
Сохранить
</button>
</form>
Inputmask("ip", {
clearIncomplete: true
}).mask("#ip");
document
.getElementById("networkForm")
.addEventListener("submit", function (event) {
const input = document.getElementById("ip");
if (!input.inputmask.isComplete()) {
event.preventDefault();
alert("Некорректный IP");
}
});