2012-11-18 74 views
3

我下面舉個例子字符串:從一個字符串除了數字和貨幣分母剝去一切

The price is $54.00 including delivery 
On sale for £12.99 until December 
European pricing €54.76 excluding UK 

從他們每個人我只想返回的價格和貨幣分母

$54.00 
£12.99 
€54.76 

我的過程是有一個貨幣符號陣列,並搜索每個字符串,然後捕獲之前的空間字符 - 然而,67.00美元然後將失敗

因此,我可以通過預設貨幣符號的數組運行,然後將字符串爆炸,並在非數字字符的下一個實例中將其切下。或者,或者 - 也許與正則表達式

這可能嗎?

+0

我會說與一個正則表達式,否則你會最終有一個體面的代碼檢查和轉移的東西。警惕'.'和','s的替代用法。 –

回答

4

在正則表達式中,\p{Currency_Symbol}\p{Sc}代表任何貨幣符號。

但是,PHP supports只有速記形式\p{Sc}/u修飾符是必需的。


使用正則表達式

/\p{Sc}\s*\d[.,\d]*(?<=\d)/u 

,你將能夠匹配,例如:

  • $的1,234
  • £12.3
  • €5,345。01

如果你想使用.作爲小數點分隔和,作爲千分隔符,然後用

/\p{Sc}\s*\d{1,3}(?:,\d{3})*(?:\.\d+)?/u 

檢查this demo去。

+1

'Currency_Symbol',太棒了!必須記住這個 – Evert

+0

@Ωmega爲什麼這會失敗? preg_match('/ \ p {Currency_Symbol} \ s * \ d {1,3}(?:, \ d {3})*(?:\。\ d +)?/ u',$ input,$ match) ; $輸入是字符串 –

+0

@DarrenSweeney - 答案已更新演示。 –

1

你可以去這樣的事情:

preg_match('/(?:\$|€|£)\s*[\d,.-]+/', $input, $match); 

然後發現裏面$match您的貨幣和價格。

當然,您可以從貨幣符號數組中生成第一部分。只是不要忘記逃跑的一切:

$escapedCurrency = array_map("preg_quote", $currencyArray); 
$pattern = '/(?:' . implode("|", $escapedCurrency) . ')\s*[\d,.-]+/'; 
preg_match($pattern, $input, $match); 

一些可能的改進模式的結束(實際數):

(?:\$|€|£)\s*\d+(?:[.,](?:-|\d+))? 

這將確保只有一個.,其次是-或只有數字(如果您的意圖是允許國際小數點分隔符)。

如果你只想讓逗號分隔千,你可以去這樣的:

(?:\$|€|£)\s*\d{1,3}(?:,\d{3})*(?:\.(?:-|\d+))? 

這將最長的「正確」格式的數字匹配(即$ 1,234.4567,123.456 - >$ 1,234.4567€ 123,456789.12 - >€ 123,456 )。這真的取決於你想要的準確程度。

+1

非常感謝您的幫助! –

相關問題