2014-01-11 14 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

相關問題