У меня следующие строки строк:
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 долл.
Итак, могу ли я запустить массив предустановленных символов валюты, затем взорвать строку и прервать ее в следующем экземпляре не числового символа, который не является. или, возможно, с регулярным выражением
Это возможно?
В регулярном выражении \p{Currency_Symbol}
или \p{Sc}
представляют собой любой символ валюты.
Однако PHP поддерживает только сокращенную форму \p{Sc}
и /u
модификатор.
Использование шаблона регулярного выражения
/\p{Sc}\s*\d[.,\d]*(?<=\d)/u
вы сможете сопоставить, например:
Если вы хотите использовать .
как десятичный разделитель и ,
как разделитель тысяч, затем переходите к
/\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
). Это действительно зависит от того, насколько вы точны.