3

我有以下示例字符串:

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 然后会失败

那么,我可以遍历一组预设货币符号,然后分解字符串并在下一个不是 . 或 , - 或者可能使用正则表达式

这可能吗?

4

2 回答 2

4

In regex, \p{Currency_Symbol} or \p{Sc} represent any currency symbol.

However, PHP supports only the shorthand form \p{Sc} and /u modifier is required.


Using regex pattern

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

you will be able to match for example:

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

If you want to use . as a decimal separator and , as a thousands delimiter, then go with

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

Check this demo.

于 2012-11-18T14:46:26.073 回答
1

你可以这样做:

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+))?

这将确保只有一个.or,后跟一个-或只有一个数字(如果您的意图是允许使用国际小数分隔符)。

如果您只想让逗号分隔数千,您可以这样做:

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

这将匹配最长的“正确”格式的数字(即$ 1,234.4567,123.456->$ 1,234.4567€ 123,456789.12-> € 123,456)。这实际上取决于您想要达到的准确度。

于 2012-11-18T14:43:27.043 回答