2012-06-03 72 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