2012-06-03 44 views
1

我知道这个主题已经在某种程度上被覆盖了,但几天之后,我仍然很难找出从文本块中解析价格的最佳方法。PHP正则表达式帮助解析字符串价格

下面的是一些例子: 这辆车是$ 15,000,并且在升级200 $ 那些带是USD 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); 

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

+1

''^意味着原始字符串的开始和'$'意味着原始字符串的结尾。如果将它们添加进去,当然你将无法在字符串中匹配一些标记。 – nhahtdh

+1

请注意,我们在德国使用类似于:1.999,99€ – rekire

回答

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,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))(?= |$)/

一样的,如果你想添加更多后缀以上。

测试输入和try it out

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

+1

哇 - 谢谢!这将需要我整个星期来解决这个问题。 preg_match_all('/(?<= | ^)(?:[0-9] {1,3}(?:,?[0-9]){3 })*(:\ [0-9] *)| [0-9] {1,3}(?:????\ [0-9] {3})*(:,[O- 9] *)?)*(?:\ $ | usd | eur | euro | euros | firm | obro |€|£| gbp | dollar | aud | cdn | sgd)+(?= | $)/',strtolower ($ description),$ price_array3);并且这个前缀为:preg_match_all('/(?<= | ^)(?:(?i)(?:\ $ | usd | price:| euro |£| gbp | cdn | sgd)*)+ (:[0-9] {1,3}(:,[0-9] {3})*(:?????\ [0-9] *)| [0-9] {1, 3}(?:\ [0-9] {3}。?)*(:,[0-9] *)?????!)(:(ⅰ)K)([0-9, ])/',strtolower($ description),$ price_array1); – user1420094