正则表达式中逗号后的可选匹配项

时间:2011-10-17 17:30:24

标签: php regex optional-parameters

我努力工作到目前为止但最终却无法正常工作!!

我想要达到的目标如下: 我有一个preg_replace_callback函数,我想解决我的“字典”函数。

我使用自己的“词典”标签:

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

这应该调用我的函数“字典”。与它的论述相关的函数是:dictionary($search,$section,$upper=null)

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

我的回调函数使用“dictionary”标签中的值调用该函数。

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])?\]\>/

但这不能正常工作。我得到以下结果:

for&lt; [general,username]&gt;我得到了

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

for&lt; [general,username,1]&gt;我得到了

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

但我想

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

我做错了什么?

3 个答案:

答案 0 :(得分:2)

默认情况下正则表达式是贪心的,所以第一组也匹配第一个逗号。试试这个:

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

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:1)

从第二组范围中排除逗号....

或者,假设前两个术语仅为字母数字:

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