除了数字和货币分母之外,从一个字符串中删除所有内容

时间:2012-11-18 14:36:57

标签: php regex explode

我有以下示例字符串:

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美元将失败

所以,我可以运行一系列预设货币符号,然后将该字符串分解并将其切换到非数字字符的下一个实例。或者, - 或者也许是正则表达式

这可能吗?

2 个答案:

答案 0 :(得分:4)

在正则表达式中,\p{Currency_Symbol}\p{Sc}代表任何货币符号。

但是,PHP supports只需要缩写形式\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

检查 this demo

答案 1 :(得分: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+))?

这将确保只有一个.,后跟-或仅数字(如果您打算允许国际小数点分隔符)。

如果你只想让逗号分开成千上万,你可以这样做:

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

这将匹配最长的“正确”格式化的数字(即$ 1,234.4567,123.456 - &gt; $ 1,234.4567€ 123,456789.12 - &gt; € 123,456)。这实际上取决于你想要的准确程度。