preg_match() 或用于检查货币的类似功能


preg_match() or similar function for checking currency

1.449,00
1.000.000,55
19,90
etc
etc

我知道我上面列出的内容非常多变,但货币的可能性。我正在寻找一个preg_match()示例或任何其他函数来处理上述可能的情况。我尝试了下面的示例,但它无法正常工作。有机会给我一个最合适的模式吗?

if (! preg_match('/^[0-9.,]$/', $currency)) { echo 'No good.'; }

这样的事情应该可以工作:

/^((?:'d{1,3}[,'.]?)+'d*)$/

这匹配:

^         - Start of string
(         - Capture the following:
 (?:      
  'd{1,3} - One to three digits
  [,'.]?  - And an optional separator (comma or period)
 )+       - One or more times
 'd*      - Zero or more digits
)
$         - End of string

它的工作原理是迭代地将所有内容与分隔符的左侧(如果存在)匹配,然后'd*来拾取任何可选的货币分数。

您可以看到它通过了所有测试。

编辑:更新的正则表达式如下所示:

^((?:'d'.'d{3}'.|'d{1,3}'.)?'d{1,3},'d{1,2})$

我们匹配的地方:

  • 'd'.'d{3}'. - 一位数字、句点、三位数字、句点或
  • 'd{1,3}'. - 一位和三位数字,一个句点
  • 以上都不是(因为?

然后,我们匹配:

  • 'd{1,3}, - 一到三位数字和一个逗号,后跟
  • 'd{1,2} - 一位或两位数字

]后添加+以允许多个字符。