2012-05-25 52 views
0

我遇到了PHP正則表達式匹配問題。正則表達式不能正確評估在PHP中

我想解決的問題是我需要從字符串中獲取小數值。表達需要滿足以下所有(所有美元符號可選):

($)1234.56 
($)1,234.56 
($)1.00 
($)10 
($).49 
($)1,234,567.32 
($)1,234,567 

網上找到了一些精彩的例子之後,我能夠Frankentstein這個表達式在一起:如果您使用此的preg_match

/(?:^|\s|\$)([1-9](?:\d*|(?:\d{0,2})(?:,\d{3})*)(?:\.\d*[0-9])?|0?\.\d*[0-9]|0)(?:\s|$)/ 

測試儀on solmetra,使用上述模式和測試字符串'每單價$ 19198.01 hey!'你會得到以下結果:

Array 
(
    [0] => $19198.01 
    [1] => 19198.01 
) 

這是偉大的 - 這正是我所需要的!

然而,當我在PHP 5.3.10運行下面的代碼,我得到空爲使用這種模式字符串匹配輸出:

代碼:

$pattern = '/(?:^|\s|\$)([1-9](?:\d*|(?:\d{0,2})(?:,\d{3})*)(?:\.\d*[0-9])?|0?\.\d*[0-9]|0)(?:\s|$)/'; 
    $subject = 'per unit price $19198.01 hey!'; 
    $matches = preg_match($pattern,$subject);     
    var_dump($matches[0]); //dumps "null" 

我敢肯定,我」我做錯了什麼,但我看不到它。

任何幫助將不勝感激。

環境:

PHP 5.3.10 
Apache 2.2.21 
Windows 2008 Server 
+1

表示不是十進制值,而是格式化的貨幣字符串。 – Gordon

回答

5

你的錯誤只是在功能用途:

$matches = preg_match($pattern,$subject); 

什麼你實際上是越來越有:

$booleanresult = ... 

但你需要第三PARAM以preg_match爲實際結果:

$bool = preg_match($pattern, $subject, $matches); 

而瞧,你的正則表達式確實有效。我還建議使用/x標誌,以使其更具可讀性。

+0

完美,謝謝。 – VPel