正则表达式 - 在前面提取数字或后跟货币符号时提取数字

时间:2014-01-11 17:48:37

标签: regex preg-match preg-match-all

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个数字。 只要两者之间有空格,它就会以相同的字符串格式提取多个数量。

我认为它涵盖了所有内容,但我确信它可以简化。

国际订单表格需要客户输入金额以及同一领域的描述。

2 个答案:

答案 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)

Live demo