Удалите все из строки, кроме числа и знаменателя валюты.

У меня есть следующие строки примеров:

The price is $54.00 including delivery
On sale for £12.99 until December
European pricing €54.76 excluding UK

Из каждого из них я хочу вернуть только цену и знаменатель валюты

$54.00
£12.99
€54.76

Мой, хотя процесс, состоит в том, чтобы иметь массив символов валюты и искать строку для каждого из них, а затем захватывать только символы до пробела после этого - однако $ 67,00 тогда не удастся

Итак, могу ли я запустить массив предустановленных символов валюты, затем взорвать строку и разбить ее на следующий экземпляр нечислового символа, который не является . или, - или, может быть, с регулярным выражением

Это возможно?


person StudioTime    schedule 18.11.2012    source источник
comment
Я бы сказал, используйте регулярное выражение, иначе вы получите приличное количество проверок кода и изменений. Будьте осторожны с альтернативным использованием . и ,s.   -  person Matt Whipple    schedule 18.11.2012


Ответы (2)


В регулярном выражении \p{Currency_Symbol} или \p{Sc} представляют любой символ валюты.

Однако PHP поддерживает только сокращенную форму \p{Sc}, а модификатор /u требуется.


Использование шаблона регулярного выражения

/\p{Sc}\s*\d[.,\d]*(?<=\d)/u

вы сможете сопоставить, например:

  • $1,234
  • £12.3
  • € 5,345.01

Если вы хотите использовать . в качестве десятичного разделителя и , в качестве разделителя тысяч, используйте

/\p{Sc}\s*\d{1,3}(?:,\d{3})*(?:\.\d+)?/u

Посмотрите эту демонстрацию.

person Ωmega    schedule 18.11.2012
comment
Currency_Symbol, круто! должен помнить об этом - person Evert; 18.11.2012
comment
@Ωmega Почему это не удается? preg_match('/\p{Currency_Symbol}\s*\d{1,3}(?:,\d{3})*(?:\.\d+)?/u', $input, $match); $input это строка - person StudioTime; 18.11.2012
comment
@Ωmega С уважением, блестяще! - person StudioTime; 18.11.2012

Вы можете пойти на что-то вроде этого:

preg_match('/(?:\$|€|£)\s*[\d,.-]+/', $input, $match);

А затем найдите свою валюту и цену внутри $match.

Конечно, вы можете сгенерировать эту первую часть из массива символов валюты. Только не забудьте сбежать от всего:

$escapedCurrency = array_map("preg_quote", $currencyArray);
$pattern = '/(?:' . implode("|", $escapedCurrency) . ')\s*[\d,.-]+/';
preg_match($pattern, $input, $match);

Некоторое возможное улучшение в конце шаблона (фактическое число):

(?:\$|€|£)\s*\d+(?:[.,](?:-|\d+))?

Это гарантирует, что есть только один . или ,, за которым следует либо -, либо только цифры (в случае, если вы намеревались разрешить международный десятичный разделитель).

Если вы хотите, чтобы запятая разделяла тысячи, вы можете сделать это:

(?:\$|€|£)\s*\d{1,3}(?:,\d{3})*(?:\.(?:-|\d+))?

Это будет соответствовать самому длинному "правильно" отформатированному числу (т.е. $ 1,234.4567,123.456 -> $ 1,234.4567 или € 123,456789.12 -> € 123,456). Это действительно зависит от того, насколько точным вы хотите добиться.

person Martin Ender    schedule 18.11.2012