2012-08-11 46 views
0

考慮下面的PHP代碼:動態捕獲組在正則表達式

<?php 
$str = '/foo/bar/baz'; 
preg_match('#^(/[^/]+?)*$#', $str, $matches); 
var_dump($matches); 

...我得到以下輸出:

array (size=2) 
    0 => string '/foo/bar/baz' (length=12) 
    1 => string '/baz' (length=4) 

...但我不明白爲什麼。我期望的(/[^/]+?)每場比賽被捕獲到它自己的組並堅持到$matches,使得它看起來像這個:

array (size=4) 
    0 => string '/foo/bar/baz' (length=12) 
    1 => string '/foo' (length=4) 
    2 => string '/bar' (length=4) 
    3 => string '/baz' (length=4) 

我缺少什麼?

編輯:

這是輸出,如果我用preg_match_all()代替,這仍然不是我要找:

array (size=2) 
    0 => 
    array (size=1) 
     0 => string '/foo/bar/baz' (length=12) 
    1 => 
    array (size=1) 
     0 => string '/baz' (length=4) 

回答

0

的preg_match只抓住第一。如果你想要所有這些,請使用preg_match_all。

但是:如果這確實是確切的用例,請改用explode()。

+0

這不是'preg_match_all()'的作用。它會給我基本上相同的輸出,按比賽分開,但只有一場比賽。 – FtDRbwLXw6 2012-08-11 04:28:07

+0

我用'preg_match_all()'的輸出編輯了問題。 – FtDRbwLXw6 2012-08-11 04:30:29

0

也許是這樣的:

preg_match_all('(/[^/]+)', $str, $matches); 
+0

我需要匹配整個字符串,我不能使用'preg_match_all()'。例如,'$ str =「test/foo/bar/baz」'是無效的,但如果我使用它,它仍然會匹配。 – FtDRbwLXw6 2012-08-11 04:48:21