Avatar ·

Извлечение целого числа из строки в PHP: как получить только цифры?

Всем привет! Я новичок в PHP и столкнулся с проблемой. У меня есть строка, например: "Цена: 1234 руб." или "Артикул #5678-90". Мне нужно извлечь из неё целое число (без знака), то есть получить только цифры, отбросив всё остальное. Я пробовал использовать (int), но это работает только если строка начинается с цифры. Если строка "Цена 100", то (int) даёт 0, а мне нужно 100. Пытался через preg_match с регуляркой '/\d+/', но не уверен, что это правильно, особенно если в строке несколько чисел (например, "Код 123, цена 456"). Подскажите, пожалуйста, как надёжно извлечь одно целое число из строки? Желательно с примером кода. Заранее спасибо! Примеры строк: - "Заказ № 98765" - "Сумма: 1500 рублей" - "ID: 42" - "Результат: 0 ошибок" Какой самый простой и понятный способ для новичка? <<>>

Использование 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() из первого ответа.