Библиотека Validator.js содержит набор функций для проверки строковых данных. Одной из востребованных задач является валидация цветовых кодов: HEX, RGB, HSL и других представлений цвета.
Для проверки цветовых значений используется метод
isHexColor() и дополнительные подходы на основе регулярных
выражений либо кастомной логики.
Для Node.js:
npm install validator
Подключение:
const validator = require('validator');
В ES-модулях:
import validator from 'validator';
Validator.js предоставляет встроенный метод:
validator.isHexColor(str)
Метод возвращает:
true — если строка является корректным HEX-кодом;false — если строка некорректна.validator.isHexColor('#ffffff'); // true
validator.isHexColor('#000000'); // true
validator.isHexColor('#ff5733'); // true
Некорректные значения:
validator.isHexColor('ffffff'); // false
validator.isHexColor('#zzz999'); // false
validator.isHexColor('#12345'); // false
Validator.js поддерживает:
| Формат | Пример |
|---|---|
| 3 символа | #fff |
| 6 символов | #ffffff |
| 4 символа (RGBA) | #ffff |
| 8 символов (RRGGBBAA) | #ffffffff |
validator.isHexColor('#abc'); // true
validator.isHexColor('#0f0'); // true
RGBA-представление:
validator.isHexColor('#ff000080'); // true
ARGB также считается корректным с точки зрения структуры:
validator.isHexColor('#abcd'); // true
const color = '#3498db';
if (validator.isHexColor(color)) {
console.log('Корректный цвет');
} else {
console.log('Ошибка');
}
const formColor = req.body.color;
if (!validator.isHexColor(formColor)) {
return res.status(400).json({
error: 'Некорректный HEX-цвет'
});
}
Пользовательские данные часто содержат лишние пробелы.
const color = ' #ff0000 ';
const normalized = validator.trim(color);
console.log(
validator.isHexColor(normalized)
);
HEX-коды нечувствительны к регистру.
validator.isHexColor('#ABCDEF'); // true
validator.isHexColor('#abcdef'); // true
validator.isHexColor('#AbCdEf'); // true
Иногда требуется запретить короткие варианты.
function isFullHexColor(color) {
return /^#[0-9A-Fa-f]{6}$/.test(color);
}
console.log(isFullHexColor('#ffffff')); // true
console.log(isFullHexColor('#fff')); // false
function isShortHex(color) {
return /^#[0-9A-Fa-f]{3}$/.test(color);
}
console.log(isShortHex('#abc')); // true
console.log(isShortHex('#abcdef')); // false
function isHexWithAlpha(color) {
return /^#[0-9A-Fa-f]{8}$/.test(color);
}
console.log(isHexWithAlpha('#ff0000ff')); // true
console.log(isHexWithAlpha('#ff0000')); // false
function validateColor(color) {
return (
validator.isHexColor(color) ||
/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/.test(color)
);
}
console.log(validateColor('#fff')); // true
console.log(validateColor('rgb(255, 0, 0)')); // true
Validator.js не содержит встроенного метода isRGB(),
поэтому обычно применяются регулярные выражения.
function isRGB(color) {
return /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/.test(color);
}
Предыдущая проверка пропускает значения:
rgb(999, 500, 1000)
Для корректной валидации диапазонов:
function isValidRGB(color) {
const regex =
/^rgb\(\s*(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\s*,\s*(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\s*,\s*(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\s*\)$/;
return regex.test(color);
}
console.log(isValidRGB('rgb(255, 0, 0)')); // true
console.log(isValidRGB('rgb(300, 0, 0)')); // false
console.log(isValidRGB('rgb(12, 55, 199)')); // true
function isRGBA(color) {
const regex =
/^rgba\(\s*(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\s*,\s*(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\s*,\s*(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\s*,\s*(0|1|0?\.\d+)\s*\)$/;
return regex.test(color);
}
console.log(
isRGBA('rgba(255, 0, 0, 0.5)')
);
console.log(
isRGBA('rgba(255,255,255,1)')
);
console.log(
isRGBA('rgba(255,255,255,2)')
);
Результат:
true
true
false
hsl(120, 100%, 50%)
function isHSL(color) {
const regex =
/^hsl\(\s*(360|3[0-5]\d|[12]?\d?\d)\s*,\s*(100|[1-9]?\d)%\s*,\s*(100|[1-9]?\d)%\s*\)$/;
return regex.test(color);
}
console.log(
isHSL('hsl(120, 100%, 50%)')
);
console.log(
isHSL('hsl(400, 100%, 50%)')
);
Результат:
true
false
Validator.js не проверяет CSS-имена цветов:
red
blue
green
Для этого создаётся собственный список.
const cssColors = new Set([
'red',
'green',
'blue',
'black',
'white',
'gray'
]);
function isCSSColor(color) {
return cssColors.has(
color.toLowerCase()
);
}
function validateAnyColor(color) {
return (
validator.isHexColor(color) ||
isValidRGB(color) ||
isRGBA(color) ||
isHSL(color) ||
isCSSColor(color)
);
}
console.log(validateAnyColor('#fff'));
console.log(validateAnyColor('rgb(255,0,0)'));
console.log(validateAnyColor('rgba(0,0,0,0.5)'));
console.log(validateAnyColor('hsl(120, 50%, 50%)'));
console.log(validateAnyColor('blue'));
function validateColorMiddleware(req, res, next) {
const { color } = req.body;
if (!validator.isHexColor(color)) {
return res.status(400).json({
error: 'Некорректный цвет'
});
}
next();
}
app.post(
'/theme',
validateColorMiddleware,
(req, res) => {
res.json({
success: true
});
}
);
const colors = [
'#fff',
'#000',
'#ff0000'
];
const isValid = colors.every(color =>
validator.isHexColor(color)
);
console.log(isValid);
const mixed = [
'#fff',
'red',
'#zzzzzz',
'#123456'
];
const validColors = mixed.filter(color =>
validator.isHexColor(color)
);
console.log(validColors);
const theme = {
primary: '#3498db',
secondary: '#2ecc71',
danger: '#e74c3c'
};
const allValid = Object.values(theme)
.every(value =>
validator.isHexColor(value)
);
console.log(allValid);
function normalizeHex(color) {
return color.toLowerCase();
}
console.log(
normalizeHex('#ABCDEF')
);
function expandShortHex(color) {
if (/^#[0-9A-Fa-f]{3}$/.test(color)) {
return '#' + color
.slice(1)
.split('')
.map(char => char + char)
.join('');
}
return color;
}
console.log(
expandShortHex('#abc')
);
Результат:
#aabbcc
function validateHex(color) {
if (!color) {
return 'Цвет не указан';
}
if (!validator.isHexColor(color)) {
return 'Некорректный HEX-цвет';
}
return null;
}
Некорректно:
ffffff
Корректно:
#ffffff
Некорректно:
#fffff
#fffffff
Некорректно:
#gggggg
#12xz89
const result = colors.every(
validator.isHexColor
);
Метод every() прекращает проверку сразу после первого
некорректного значения, что снижает лишние вычисления.
function validateTheme(theme) {
const requiredFields = [
'primary',
'secondary',
'background',
'text'
];
for (const field of requiredFields) {
if (!validator.isHexColor(theme[field])) {
return false;
}
}
return true;
}
const handleChange = (e) => {
const value = e.target.value;
if (validator.isHexColor(value)) {
setColor(value);
}
};
const schema = new mongoose.Schema({
color: {
type: String,
validate(value) {
return validator.isHexColor(value);
}
}
});
| Подход | Преимущества | Недостатки |
|---|---|---|
| Validator.js | Простота, читаемость | Только HEX |
| Regex | Гибкость | Сложность |
| Комбинированный | Максимальный контроль | Больше кода |
validator.isHexColor() для стандартных
HEX-цветов.trim().