Перейти к содержанию

regex

Получение цены из строк вида 1,4 rub., 1 rub., $ 1,54

  • регулярка

    (?<price>\d+([.,]\d+)?)
    (?<price>\d+(?:[.,]\d+)?)
    

    Пояснение регулярки
    • Надо извлечь из строки ту часть, которая состоит из цифр. Между цифрами может быть знак препинания точка или запятая. Знаков препинания может и не быть
    • ([.,]\d+)? — знаки препинания имеют смысл только если после них есть цифра. ()? проверяет, что группа может встретиться 0 или 1 раз
    • (?:...) — незахватывающая группа. То есть найденный результат по такому паттерну не попадёт в $matches. Можно и не использовать.
    • (?<price>...) — именованная группа. Найденный результат получит имя. В $mathes появится поле 'price', куда запишется найденный результат
    • После этого останутся только цифры и знак препинания между ними. Чтоб php мог такую строку сконвертировать в число — надо возможную запятую сменить на точку с помощью str_replace
  • логика получения цены из строки

    $input = '123,12 rub.';
    $pattern = '/(?<price>\d+(?:[.,]\d+)?)/';
    $mathes = [];
    preg_match($pattern, $input, $matches);
    $price = (float) str_replace(',', '.', $matches['price'] ?? '');