【问题标题】:Strip everything from a string apart from a number and currency denominator除了数字和货币分母之外,从字符串中删除所有内容
【发布时间】:2012-11-18 14:36:56
【问题描述】:

我有以下示例字符串:

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

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

这可能吗?

【问题讨论】:

  • 我会说使用正则表达式,否则您最终会进行大量的代码检查和转换。警惕.,s 的交替使用。

标签: php regex explode


【解决方案1】:

在正则表达式中,\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

【讨论】:

  • Currency_Symbol,太棒了!一定要记住这个
  • @Ωmega 为什么会失败? preg_match('/\p{Currency_Symbol}\s*\d{1,3}(?:,\d{3})*(?:\.\d+)?/u', $input, $match); $input 是字符串
  • @Ωmega 感谢,太棒了!
【解决方案2】:

你可以这样做:

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)。这实际上取决于您想要达到的准确度。

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 2010-10-24
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多