我努力工作到目前为止但最终却无法正常工作!!
我想要达到的目标如下: 我有一个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
我做错了什么?
答案 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+)?\]\>