2012-01-19 40 views
1

基本上我想匹配str中的一個簡單的東西,但只想返回此匹配的第一部分。這是我想看看。正則表達式 - 單元格旁邊的浮點數字模式是什麼

喬4.5盎司感冒和流感的東西喝。

我想要做的是返回4.5,但只有當匹配後跟一次單位的變化。

這是我的猜測

/([0-9]*\.?[0-9])(?:[\s+][o(?<=\.)z(?<=\.)|ounce]?=\s)/i 

上匹配:

4.5oz 
4.5 oz 
4.5 o.z. 
4.5 oz. 
4.5   oz. 
4.5ounce 
4.5Ounce 
4.5 Oz. 

,但我得到,當我運行它呢。

$matches = null; 
$returnValue = preg_match('/([0-9]*\.?[0-9])(?:[\s+][o(?<=\.)z(?<=\.)|ounce]?=\s)/i', 'Jo 4.5 Oz cold and flu stuff to drink.', $matches); 

任何幫助將是偉大的。謝謝 乾杯-Jeremy

回答

2

然後,你需要像一個不太複雜的圖案:

preg_match('/ 
     (\d+(\.\d+)?)    # float 
     \s*      # optional space 
     (ounce | o\.? z\.?)  # "ounce" or "o.z." or "oz" 
    /ix',       # make it case insensitive 
    $string, $matches); 

然後要不是看在結果$matches[1]或在(?=...)左右包圍它使其餘的帶有斷言。

+0

yeps關於我在哪裏.. /([\d]+.{1}[\d]+)(?:\s*o\.?z\.?|ounce)/i ..但我認爲你是清潔的 –

1

我認爲這可能比你在那裏嘗試的更簡單一點。如果要檢查,如果他們使用

$test_string = 'Jo 4.5 Oz cold and flu stuff to drink.'; 
$returnValue = preg_match('/\s[\d]+.{1}[\d]+\s*(oz|ounce|o.z.|oz.)/i', $test_string, $matches); 

編輯

:給這個表達式一試:

\s[\d]+.{1}[\d]+\s*(oz|ounce|o.z.|oz.) 

具有完全的PHP。或者,你可以使用:

\d+(.|,){1}\d+\s*(ounce|o\.?z\.?) 

$returnValue = preg_match('/\d+(.|,){1}\d+\s*(ounce|o\.?z\.?)/ix', $test_string, $matches); 

EDIT 2

如果你想命名的模式嘗試這個辦法:

$returnValue = preg_match('/(?P<amount>\d+(.|,){1}\d+)\s*(?P<unit>(ounce|o\.?z\.?))/ix', $test_string, $matches); 


print_r($matches); 

輸出:

Array 
(
    [0] => 4.5 Oz 
    [amount] => 4.5 
    [1] => 4.5 
    [2] => . 
    [unit] => Oz 
    [3] => Oz 
    [4] => Oz 
) 
+0

沒有,只是/([\d]+.{1}[dd]+)(?:\s*oz|ounce|oz|oz./)在$ match [1 ] ..但是有沒有更好的方式來做點..在錯字的情況下..嗯 –

+0

是啊對不起,我忘了刪除\ s(檢查空格)。不知道你的意思是「一個更好的方法來處理錯誤。」 - 你的意思是,如果他們用逗號代替?你可以使用:\ d +(。|,){1} \ d + \ s *(盎司| o \。?z \。?),然後一定要使用ix作爲忽略大小寫和擴展名... – mason81

相關問題