У меня следующие строки строк:
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 ). Это действительно зависит от того, насколько вы точны.