2014-01-11 12 views
-2
if (preg_match_all('((([£€$¥](([ 0-9]([0-9])*)((\.|\,)(\d{2}|\d{1}))|([ 0-9]([0-9])*)))|(([0-9]([0-9])*)((\.|\,)(\d{2}|\d{1})(\s{0}|\s{1}))|([0-9]([0-9])*(\s{0}|\s{1})))[£€$¥]))', $Commande, $matches)) { 
    $tot1 = $matches[0]; 

这是我测试过的解决方案。正则表达式 - 在前面提取数字或后面跟着货币符号

它适用于所有4种货币,当标志放置在之前或之后时,有或没有空格时。 它使用小数点或逗号作为小数。 它工作时没有十进制,或者在点或逗号后面只有一个数字。 只要中间存在空格,它就会以相同的字符串提取多个格式的混合格式。

我认为它涵盖了一切,虽然我相信它可以被简化。

客户输入金额本身以及相同领域的描述时,需要国际订单。

+0

心灵解释所有的场景(火柴和失败的例子),你想捕捉?它看起来像你的整个表达式可以清理。 – Sam

+1

您的RegEx不好。第一种可能性(一个没有百万/十亿/等)匹配例如'$,.24'。 – tenub

回答

0

您可以使用条件:

if (preg_match_all('~(\$ ?)?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?(?:[pcm]|bn|[mb]illion)?(?(1)| ?\$)~i', $order, $matches)) { 
    $tot = $matches[0]; 
} 

说明:

我把货币的第一个捕获组:(\$ ?),我一定能选购有?
在模式的结尾,我使用如果其他人

(?(1)   # if the first capturing group exist 
       # then match nothing 
    |   # else 
[ ]?\$  # matches the currency 
)    # end of the conditional 
0

你应该在量的末尾检查有无可选$

\$? ?(\d[\d ,]*(?:\.\d{1,2})?|\d[\d,](?:\.\d{2})?) ?\$?(?:[pcm]|bn|[mb]illion) 

Live demo

相关问题