Извлечение целого числа из строки в PHP: как получить только цифры?
Использование preg_match() для извлечения первого числа
Самый надёжный и гибкий способ — использовать регулярные выражения с функцией preg_match(). Она ищет первое совпадение с шаблоном и возвращает его. Для извлечения целого числа (только цифры) подойдёт шаблон /\d+/, где \d — любая цифра, а + — одна или более.
<?php
function extractNumber($string) {
preg_match('/\d+/', $string, $matches);
return isset($matches[0]) ? (int)$matches[0] : 0;
}
// Примеры
echo extractNumber("Цена: 1234 руб."); // 1234
echo extractNumber("Артикул #5678-90"); // 5678 (первое число)
echo extractNumber("Результат: 0 ошибок"); // 0
?>
Пояснение
preg_match('/\d+/', $string, $matches)— ищет первое вхождение одной или нескольких цифр.$matches[0]содержит найденную строку (например, "1234").- Мы приводим результат к
(int), чтобы получить именно число, а не строку. - Если совпадений нет, возвращаем 0 (или можно вернуть
null, если нужно обрабатывать отсутствие числа).
Если нужно извлечь все числа из строки
Иногда требуется получить все числа, а не только первое. Для этого используйте preg_match_all():
<?php
$string = "Код 123, цена 456";
preg_match_all('/\d+/', $string, $matches);
print_r($matches[0]); // Array ( [0] => 123, [1] => 456 )
?>
Альтернатива: filter_var()
Если строка содержит только цифры и мусорные символы (без букв между цифрами), можно использовать filter_var() с флагом FILTER_SANITIZE_NUMBER_INT. Но он оставляет знак минус, поэтому для unsigned integer нужно дополнительно очищать:
<?php
$string = "Цена: -1234 руб.";
$number = filter_var($string, FILTER_SANITIZE_NUMBER_INT);
echo (int)ltrim($number, '-'); // 1234
?>
Однако этот метод менее надёжен, если в строке есть буквы между цифрами (например, "a1b2c3" даст "123").
Рекомендация для новичков
Используйте preg_match() с шаблоном /\d+/ — это стандартный и понятный подход. Он работает в 99% случаев и легко читается. Если нужно извлечь число из сложной строки (например, "ID-123-ABC"), регулярное выражение можно уточнить: /\d+/ всё равно найдёт первое число.
Использование str_replace() и ctype_digit()
Если строка содержит только цифры и один тип разделителя (например, пробелы или дефисы), можно обойтись без регулярных выражений. Удалите все нецифровые символы с помощью str_replace() или preg_replace():
<?php
function extractNumberSimple($string) {
// Удаляем всё, кроме цифр
$digitsOnly = preg_replace('/[^0-9]/', '', $string);
return $digitsOnly === '' ? 0 : (int)$digitsOnly;
}
echo extractNumberSimple("Артикул: 12345"); // 12345
echo extractNumberSimple("Нет цифр"); // 0
?>
Этот метод извлекает все цифры подряд, игнорируя их расположение. Например, из строки "a1b2c3" получится 123. Если вам нужно именно первое число, этот способ не подойдёт — он склеит все цифры.
Когда использовать
- Если строка гарантированно содержит только одно число (например, "ID: 42").
- Если порядок цифр не важен (например, нужно просто получить все цифры подряд).
- Для очень простых случаев, где регулярные выражения кажутся избыточными.
Минус метода: если в строке несколько чисел (например, "Код 12, цена 34"), вы получите 1234, что может быть неверным. Поэтому для точного извлечения первого числа лучше использовать preg_match() из первого ответа.