Регулярное выражения php

newProgrammer

Здравствуйте. хочу получит счет:

echo(preg_replace("/[^\d.]/", '', '182.20 Старая цена.'));

получаю:

182.20.

как мне получит только: 182.20

3 ответа

newProgrammer

Цену можно извлечь, например, так:

/\d+(?:\.\d+)?/

а с помощью preg_replace заменить следующим образом:

$value = preg_replace("/.*?(\d+(?:\.\d+)?).*/", "$1", $str);

Но, возможно, для ваших целей будет достаточно следующего?

$str = '182.20 Старая цена.';
 $value = trim(stri_replace("старая цена.", "", $str));

Что происходит здесь, и почему не работает ваше выражение.

  • В своем выражении вы удаляете (заменяете на пустоту) все символы отличные от точки \. и цифр \d. Поэтому последняя точка также остается на месте. Если ваша входная строка будет иметь вид 123.345.456.890 то вся эта конструкция подойдет под это выражение результат.
  • В приведенном в начале ответа выражении из строки извлекается число, с возможно дробной частью. Первая часть \d+ соответствуюет целой части. Длаее идет группа для дробной части (?:\.\d+)?. Здесь во-первых, конечный знак ? говорит о том, что этой группы может и не быть. Начальная конструкция ?: в скобках говорит, что ее не надо захватывать (non-capturing group). Внутри же группы должна находится точка .\и 1 или более цифр \d+.

Таким образом, приведенное выражение просто соответствуюет любому целому или дробному числу с разделителем точкой.


newProgrammer

if (preg_match('/^(\d+(?:\.\d+)?)/', '182.20 Старая цена.', $match)) {
    echo $match[1];
}
else {
    // Неправильная цена
}


newProgrammer

Ну можно более короткий способ использовать для этого просто привести к float строку

http://sandbox.onlinephpfunctions.com/code/214972ada960fe609965f9e1d66b46772d21c81a

licensed under cc by-sa 3.0 with attribution.