1

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

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

我的方法是进行三个单独的正则表达式匹配:

  1. 查找缩写为 K 的价格
  2. 查找带有前缀的价格
  3. 查找带有后缀的价格

寻找带有千位缩写的美元

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);

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

4

1 回答 1

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,34534, 283947982.234, 283.432, 234424., 4234,4324, 2.234.434,23442, 3,234,234.234, 324849000. 但它会拒绝.453985, ..,.,.434.,.34, 234,43.234, 23467,4443.234.

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

/(?<= |^)(?:(?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)

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

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

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

如果要添加更多后缀,同上。

测试输入并尝试一下

Here's are some examples: This car is $15k and has $200 in upgrades Those belts are USD 500.00 and I'm asking 50 for shipping 345,345.45 495.344,424 ..,5435 878,543.455.345 345345435.545 234728394,34345 345, 453. 0.4355 .453 sdfsd usd 23423423K

于 2012-06-03T18:26:53.263 回答