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种货币。 它适用于小数点或点或逗号。 它不带小数,或者在点或逗号后只有1个数字。 只要两者之间有空格,它就会以相同的字符串格式提取多个数量。
我认为它涵盖了所有内容,但我确信它可以简化。
国际订单表格需要客户输入金额以及同一领域的描述。
答案 0 :(得分: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];
}
说明:
我将货币放在第一个捕获组中:(\$ ?)
我将其设为可选?
在模式结束时,我使用 if if else else :
(?(1) # if the first capturing group exist
# then match nothing
| # else
[ ]?\$ # matches the currency
) # end of the conditional
答案 1 :(得分:0)
您应该在金额结束时检查可选$
:
\$? ?(\d[\d ,]*(?:\.\d{1,2})?|\d[\d,](?:\.\d{2})?) ?\$?(?:[pcm]|bn|[mb]illion)