2013-07-24 34 views
1

我有一個字符串:正則表達式匹配一個點前面的數字

Product, Q.ty: 1, Price: 120.00 

我想選擇所有第一個逗號,直至最後兩位十進制數(.00)之後 - 或者,換句話說,請選擇Product,這將會變化;什麼是不可變的是, Q.t而且它也是已知的,字符串中的最後兩個字符將是兩個數字前面有一個點. - 然而只有最後一個將總是0,它之前的那個可以是任何東西0-9,但總是一個數字。

我用這個字符串匹配:

preg_replace('/' . preg_quote(', Q.t') . '.*?' . preg_quote('.00') . '/', '', $data); 

的問題是,它在最後兩位數字是不是00而是別的東西像50失敗,40,30等。如果我使用相同的正則表達式與單個數字'0',它不會工作,因爲它會趕上像我在前面的例子中的字符串中的第一個0,並將留下剩餘0.

如何調整此表達式以捕獲以'。'開頭的一組數字。點?

*還有一點需要注意:這個preg_replace位於foreach循環內;一些數據在我試圖通過的模式中不會匹配;沒關係,所以在這些情況下,我可以按照他們的方式打印字符串;但在有一個匹配的foreach的情況下,我想更換什麼也沒有字符串的一部分*

謝謝

+1

作爲一個輕微的提示,你可以在正則表達式中使用'd'來匹配一個數字。 – Tro

+0

你可能會顯示其他示例字符串,並讓我們知道還有什麼是靜態的,如**產品,**和**價格:**我假設。 – varubi

+0

「產品」變化; 「,Q.t」將停留在那裏,字符串中的最後兩個字符將始終爲數字,並以點「。」開頭。 – unfulvio

回答

2
/([^,]*), Q\.ty: (\d*), Price: (\d*\.\d{2})/ 

通過使用([^,]*),它將使用字符串中的逗號作爲第一個分隔符。這將捕獲字符串的開頭直到第一個逗號,第二個匹配將是數量,最後一個匹配將是價格。

所以您提供的字符串:

Product, Q.ty: 1, Price: 120.00 

將在一個側面說明,我不知道返回

$1 = Product 
$2 = 1 
$3 = 120.00 

如果Q.ty Q之後的時段是你的榜樣或者只是故意一個錯字。

+0

謝謝,實際上我不需要變量;在我原來的問題preg_replace用於foreach循環和一些數據根本不匹配;我正在尋找一些東西來替換我的示例中的preg_replace的內容,尤其是對於第二個preg_quote() – unfulvio

+1

這裏是一個鏈接,以便您可以在preg替換中看到該操作中的模式。 http://phpfiddle.org/lite/code/5tj-zx0 我列出的那些變量實際上是preg_replace的第二個參數的反向引用。在我看來,它比你的原始模式更清潔一些,並允許你重新格式化字符串,然而你想要變化的細節。如果你堅持保持你的表情。 更改 ''。*?' 。 preg_quote(」 00' )。 '/',' 至 ''。*?\。\ d0 /',' – varubi

2

爲什麼不

/(\d+\.\d{2})$/ 

這將捕獲任何尾隨「號「有一個小數位?

+0

謝謝,我需要在第一個逗號後面找到所有內容,而不僅僅是右邊的最後一個數字;基本上我只需要保留「產品」標籤,換句話說 – unfulvio

1

如果你想要一個字面點,你應該看看它:\。

2

您可以嘗試

(.+?), (Q\.ty: \d+, .+?\.\d{2}) 

這應該抓住一切從第一個逗號到最後兩位數字爲$ 2,與產品標籤被保持在$ 1中

+0

您正在使用後面的內容。它實際上並沒有「捕捉」聲明中的「Q \ .ty:」部分。它只檢查它的存在。 –

+0

哎呀,我以爲OP想要Q.中的逗號後面的文字。回答編輯。 –

+0

很酷。只是覺得我會指出那些不熟悉四處看看的人。 –

2

我想有人(總是存在)會說:「你可以拿到str_replace()explode()。」但它不是更快。

<?php 

$string = "Product, Q.ty: 1, Price: 120.00"; 
$removals = array(",",":"); 


$stime = microtime(); 
    $nstring = str_replace($removals,'',$string); 
    $parts = explode(" ",$nstring); 

echo microtime()-$stime."secs\n"; 
    print_r($parts); 

$pattern = "!^([A-Za-z]+),\s([A-Za-z.]+)\:\s([0-9]+),\s([A-Za-z]+):\s([0-9.]+)$!"; 

$ptime = microtime(); 
    $m = preg_match($pattern,$string,$matches); 
echo microtime()-$ptime."secs\n"; 

print_r($matches); 

?> 

輸出

4.0999999999958E-5secs 
Array 
(
    [0] => Product 
    [1] => Q.ty 
    [2] => 1 
    [3] => Price 
    [4] => 120.00 
) 
3.5000000000007E-5secs 
Array 
(
    [0] => Product, Q.ty: 1, Price: 120.00 
    [1] => Product 
    [2] => Q.ty 
    [3] => 1 
    [4] => Price 
    [5] => 120.00 
) 

使用更直譯的方法,提供$string不偏離,不改善的preg_match功能的性能。

$pattern = "!^(Product), (Q\.ty): ([0-9]+), (Price): ([0-9.]+)$!"; 
相關問題