2011-10-17 71 views
0

我很努力並得到了這麼遠,但最終它不工作!正則表達式逗號後的可選匹配

我想要做的是以下幾點: 我有一個preg_replace_callback函數,我想解決我的「字典」功能。

我用我自己的 「字典」 標籤:

<[general,username]> 
<[general,username,1]> 

這應該叫我的功能 「字典」。它的功能是ararguments是:dictionary($search,$section,$upper=null)

$search = filename 
$section = array key 
$upper = (int) 1 to 3 

我的回調函數調用從「字典」標記的值的功能。

for <[general,username]> I need 
- $search = general 
- $section = username 
- $upper = null 

but for <[general,username,1]> I want 
- $search = general 
- $section = username 
- $upper = 1 

我希望我的正則表達式總是匹配2個參數(搜索和部分),但有一個第三個可選參數。

我的正則表達式:

/\<\[([^\[]+)\,([^\[]+)(\,[0-2])?\]\>/ 

,但這不能正常工作。我得到如下結果:

爲< [一般情況下,用戶名]>我得到

[0] => <[general,username]> 
[1] => general 
[2] => username 

爲< [一般情況下,用戶名,1]>我得到

[0] => <[general,username,1]> 
[1] => general,username 
[2] => 1 

但我想

[0] => <[general,username,1]> 
[1] => general 
[2] => username 
[3] => 1 

我在做什麼錯?

回答

1

嘗試了這一點:

/\<\[([^\,]+)\,([^\,]+)(?:\,(\d+))?\]\>/ 
 
- Item[0] => whole matching text 
- Item[1] => general 
- Item[2] => username 
- Item[3] => upper (if match) 
2

默認情況下,正則表達式是貪婪的,所以第一組也匹配第一個逗號。嘗試這個代替:

/\<\[([^\[,]+)\,([^\[,]+)(?:\,([0-2]))?\]\>/ 
+2

該表達式將組t他的號碼,但也是一個逗號,**(\,[0-2])?**,所以上面的結果是錯誤的=「,」 – Eder

+0

糟糕,我應該仔細看看那部分。我會編輯它。謝謝! – MVS

1

排除來自所述第二組的範圍的逗號....

或者,假設第一2項僅爲字母數字:

\<\[(\w+)\,(\w+)\,?(\d+)?\]\>