2011-10-17 14 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グループの範囲からコンマを除外....

あるいは、第2項を仮定英数字のみです:

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