PHP Regex帮助从字符串中解析价格

时间:2012-06-03 17:56:52

标签: php regex

我知道这个主题在某种程度上已被涵盖,但几天之后我仍然无法找出从一块文本中解析价格的最佳方法。

以下是一些例子: 这辆车的价格为15,000美元,升级费用为200美元 这些腰带是500.00美元,我要求50运费

我的方法是做三个独立的正则表达式匹配:

  1. 查找以K
  2. 缩写的价格
  3. 查找带前缀的价格
  4. 查找带后缀的价格
  5. 寻找千元缩减

    的美元
    preg_match_all('/^[0-9,]+(\.[0-9]{2})?(k)+$/', 
                        strtolower($description), $price_array1);
    

    寻找带前缀的美元

    preg_match_all('/^(\$|\$ |price|price |price is |price:|price: |us|us |usd|usd |asking|asking |wanting|wanting |want|want |sgd|euro|euro |£|£ |€|€ |gbp|gbp |cdn|cdn |)+[0-9,]+(\.[0-9]{2})?$/', strtolower($description), $price_array2);
    

    查找带后缀的美元

    preg_match_all('/(\$[0-9,]+(\.[0-9]{2})?)( eur|eur| firm| obo| shipped| \$|\$| €|€| £|£| gbp|gbp| dollar| aud)+/', strtolower($description), $price_array3);
    

    但实际上这些似乎都没有奏效。我想我的正则表达式是正确的吗?但不确定为什么他们没有匹配任何东西。 我承认我对是否应该使用^和$有点困惑,但是我已经尝试过和不使用它似乎没有什么区别。 任何帮助,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

这是我对严格匹配类似数字的数字的解决方案(它不会注意到任何前缀或后缀,甚至是千分之一的k):

/(?<![0-9.,])(?:[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]*)?|[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]*)?)(?![0-9.,])/

它将接受34563745,34534283947982.234283.432234424.4234,43242.234.434,234423,234,234.234,{{ 1}}。但它会拒绝324849000.453985..,.,.434.,.34234,43.234

除了普通数字之外,以下内容将匹配不区分大小写的前缀和k(千位):

23467,4443.234

如果要添加更多前缀,可以更改正则表达式的这一部分:

/(?<= |^)(?:(?i)(?:\$|USD) *)?(?:[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]*)?|[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]*)?)(?:(?i)k)?(?![0-9.,])/

只需添加更多前缀,不需要前导或尾随空格。即使有很多空格,正则表达式也会尝试匹配。

以下匹配带后缀的数字(带有可选千位指示符):

(?:\$|USD)

如果您想添加更多后缀,则与上述相同。

测试输入和try it out

/(?<= |^)(?:[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]*)?|[0-9]{1,3}(?:\.?[0-9]{3})*(?:,[0-9]*)?)(?:(?i)(?:k )? *(?:\$|USD))(?= |$)/