2014-09-23 66 views
1

我想的preg_match下面的代碼:這個正則表達式有什麼問題?

{{{/foo:bar/a/0/b}}} 

這是我的正則表達式(它不工作,我不明白爲什麼):

|{{{\/([[:alpha:]][[:alnum:]\_]*\:[[:alpha:]][[:alnum:]\_]*)(?:\/([[:alnum:]\_]*))+}}}|Uism 

預期結果:

Array (
[0] => Array 
    (
     [0] => {{{/foo:bar/a/0/b}}} 
    ) 

[1] => Array 
    (
     [0] => foo:bar 
    ) 

[2] => Array 
    (
     [0] => a 
    ) 

[3] => Array 
    (
     [0] => 0 
    ) 

[4] => Array 
    (
     [0] => b 
    ) 
) 

結果我得到:

Array (
[0] => Array 
    (
     [0] => {{{/foo:bar/a/0/b}}} 
    ) 

[1] => Array 
    (
     [0] => foo:bar 
    ) 

[2] => Array 
    (
     [0] => b 
    ) 
) 

我只收到最後一個元素。那麼它有什麼問題?

+0

修飾符'i','s'和'm'在這裏沒用。 – 2014-09-23 05:15:14

回答

1

你重複該第二捕獲組:

(?: 
\/ 
(
    [[:alnum:]\_]* 
) 
)+ 

在外非捕獲組的每個重複中,內捕獲組的內容被改寫,這是原因爲什麼只保留最後一場比賽?這是所有正則表達式引擎的標準行爲。

0

同一個捕獲組的每個後續匹配都會覆蓋前一個;這就是爲什麼最終只有b

我在這種情況下會建議先匹配整個塊,然後使用更簡單的explode()來挖掘內部數據;使用這個表達式:

|{{{\/([[:alpha:]][[:alnum:]\_]*\:[[:alpha:]][[:alnum:]\_]*(?:\/[[:alnum:]\_]*)+)}}}|U 

然後,用所得$matches陣列(第三個參數preg_match()):

$data = explode('/', $matches[1]); 
0

你的模式是什麼完整的矯枉過正,應該是很簡單的:

$rex = "@[{]{3}/(\w+:\w+)/(\w)/(\d)/(\w)[}]{3}@"; 
$str = "{{{/foo:bar/a/0/b}}}"; 

preg_match($rex, $str, $res); 

結果:

Array 
(
    [0] => {{{/foo:bar/a/0/b}}} 
    [1] => foo:bar 
    [2] => a 
    [3] => 0 
    [4] => b 
) 
相關問題