2013-03-04 33 views
0

我想從字符串$123/123 - 1425ft² - Some random message中提取整數1425。但是,我只能提取5而不是1425以下面的代碼。PHP正則表達式匹配一個數字

在正則表達式中,我使用*來匹配多個數字。

有什麼建議出了什麼問題?謝謝!

PHP

$text = '$123/123 - 1425ft² - Some random message'; 
$pattern = '/ ([0-9])*ft²/s'; 
preg_match($pattern, $text, $matches); 

echo '<pre>'; 
print_r($matches); 

輸出

Array 
(
    [0] => 1425ft² 
    [1] => 5 
) 
+0

移動捕獲組捕獲所有的數字:''/([0-9] +)平方英尺/ s'' – nhahtdh 2013-03-04 08:58:48

+0

你需要移動的星星* *裏面的圓括號,以便捕獲組「()」包含所有匹配的數字。 – Jon 2013-03-04 08:59:01

+0

@nhahtdh這有效! – Nyxynyx 2013-03-04 08:59:29

回答

5

輕微改變你的模式

$pattern = '/ ([0-9]*)ft²/';

,或者必須有至少一個匹配數

$pattern = '/ ([0-9]+)ft²/';

+0

'/ s'修飾符在這裏沒有用處。 – 2013-03-04 09:08:20

+0

同意並刪除,它來自原始模式 – 2013-03-04 09:10:16

0
$text = '$123/123 - 1425ft² - Some random message'; 
$pattern = '/([0-9]+)ft²/s'; 
preg_match($pattern, $text, $matches); 

echo '<pre>'; 
print_r($matches); 

使用上述代碼。我已經測試過了。它的工作正常。

+1

'([0-9] +)*':2層重複=壞東西。 – nhahtdh 2013-03-04 09:01:49

+0

但它的工作很好。 – 2013-03-04 09:02:43

+1

我不知道這個正則表達式是用來做什麼的,但是我可以讓那個正則表達式進入回溯地獄並且達到回溯極限。 – nhahtdh 2013-03-04 09:06:25

0

試試這個:

$text = '$123/123 - 1425ft² - Some random message'; 
$pattern = '/(?P<number>\d+)ft²/'; 
preg_match($pattern, $text, $matches); 

echo $matches['number']; 
+0

這與OP的正則表達式略有不同。 OP的正則表達式排除了匹配位於字符串開頭的情況,並在數字前修正了空格字符。你將在字符串的開始處允許匹配,但在數字前面還有其他字符時也允許匹配。 – nhahtdh 2013-03-04 09:04:55

+0

它會匹配任何數字之前,這是OP要求。 – 2013-03-04 09:07:23

+0

我只描述不同之處。 OP是否要求OP是否取決於OP。 – nhahtdh 2013-03-04 09:09:28