Извлечение числовых значений из CSS-строк в JavaScript
Вот несколько способов извлечения числовых значений (включая знаки +/-) из строк типа «-10px 50px» и «6px» с использованием parseFloat() и других методов JavaScript.
Способ 1: Использование регулярных выражений с match()
JavaScript
function extractValues(str) {
// Регулярное выражение для поиска чисел (включая знаки) за которыми может следовать 'px'
const regex = /(-?\d+(?:\.\d+)?)(?:px)?/g;
const matches = str.match(regex);
if (matches) {
// Преобразуем найденные строки в числа
const numbers = matches.map(match => parseFloat(match));
// Если найдено только одно число, добавляем 0 как второе значение
if (numbers.length === 1) {
numbers.push(0);
}
return numbers.slice(0, 2); // Берем только первые два значения
}
return [0, 0]; // Если ничего не найдено
}
// Примеры использования:
console.log(extractValues("-10px 50px")); // [-10, 50]
console.log(extractValues("6px")); // [6, 0]
console.log(extractValues("-5.5px 15.2px")); // [-5.5, 15.2]
console.log(extractValues("100px -25px")); // [100, -25]Способ 2: Использование replace() и split()
JavaScript
function extractValuesAlt(str) {
// Удаляем все 'px' из строки и разделяем по пробелам
const cleanStr = str.replace(/px/g, '').trim();
const parts = cleanStr.split(/\s+/);
let arr = [];
// Обрабатываем каждую часть
for (let part of parts) {
if (part !== '') {
const num = parseFloat(part);
if (!isNaN(num)) {
arr.push(num);
}
}
}
// Если найден только один элемент, добавляем 0
if (arr.length === 1) {
arr.push(0);
} else if (arr.length === 0) {
arr = [0, 0];
}
return arr.slice(0, 2); // Возвращаем только первые два значения
}Способ 3: Надежная функция с exec()
JavaScript
function extractCSSValues(str) {
// Регулярное выражение для поиска числовых значений (с возможным знаком и px)
const numberRegex = /([+-]?\d*\.?\d+)(?:px)?/g;
const matches = [];
let match;
// Извлекаем все числовые значения
while ((match = numberRegex.exec(str)) !== null) {
const value = parseFloat(match[1]);
if (!isNaN(value)) {
matches.push(value);
}
}
// Формируем результирующий массив
if (matches.length === 0) {
return [0, 0];
} else if (matches.length === 1) {
return [matches, 0];
} else {
return [matches, matches[1]];
}
}Простое решение для CSS-значений
Для работы с CSS-свойствами типа left, top, margin и т.д., можно использовать более простой подход:
JavaScript
function parsePixelValue(cssValue) {
return parseInt(cssValue) || 0;
}
// Примеры:
console.log(parsePixelValue("10px")); // 10
console.log(parsePixelValue("-5px")); // -5
console.log(parsePixelValue("15.5px")); // 15 (parseInt отбрасывает десятичную часть)
// Для десятичных значений используйте parseFloat:
function parsePixelValueFloat(cssValue) {
return parseFloat(cssValue) || 0;
}
console.log(parsePixelValueFloat("15.5px")); // 15.5Объяснение регулярных выражений
В используемых регулярных выражениях:
(-?\d+(?:\.\d+)?)— ищет числа с возможным знаком минус и десятичной частью(?:px)?— опционально ищет «px» в конце (без создания группы захвата)gфлаг — для глобального поиска всех совпадений[+-]?— опциональный знак плюс или минус в начале числа
Все эти методы корректно обрабатывают:
- Отрицательные числа: «-10px»
- Положительные числа: «50px» или «+50px»
- Десятичные числа: «15.5px»
- Числа без единиц измерения: «10»
- Пробелы между значениями
Рекомендация: Используйте первый способ с match() — он наиболее читаемый и эффективный для данной задачи.