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

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

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 долл.

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

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

Solutions Collecting From Web of "Разделите все, начиная от строки, кроме числа и знаменателя валюты"

В регулярном выражении \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 

Проверьте это демо .

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

 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 ). Это действительно зависит от того, насколько вы точны.