案例如下:
我有这个字符串变体:
['var1' => $var1, 'var2' => $obj->var1['asd']]
[ 'var1' => $var1, 'var2' => $obj->var1 ]
['var1' => $var1, 'var2' => $var2]
我需要匹配$var
,$obj->var1['asd']
和$obj->var1
。
我走得那么远:
(\$[^,\s\]]+]?)
它几乎可以工作,但最后一个案例仍然没有。在此处查看此操作:regex101.com/r/cI0yP0/3
更新
感谢您的所有答案。他们都完美无缺。
现在正如Joe指出的那样,可能还有其他一些情况如下。
['var' => $obj->var1->var2[2]->var3['test']->var4]
['var1' => $obj->var1[$obj2->var1['one']]]
['var2' => $obj[3]['var']]
['var3' => $obj->method()]
答案 0 :(得分:3)
你带来了很好的正则表达式练习。您可以在下面找到3种不同的正则表达式来解决您的问题。
不确定您是否喜欢使用这样的正则表达式:
flush
<强> Working demo 强>
但是,已经改进了以上正则表达式并且可以提出这个:
(\$.*?),|(\$.*?\])\]|(\$.*?)\]
<强> Working demo 强>
添加一个字符类以获得更好的性能。我认为这是最好的。
(\$.*?\]?)(?:,|\])
<强> Working demo 强>
答案 1 :(得分:2)
这将允许您捕获链接在一起的任意数量的变量,并且不包括尾随方括号:
\$(?:(?:(?<!\$)->)?(?:[a-zA-Z]\w*(?:\[[^\[\]]+\])*)(?:\(\))?)+
例如,这将捕获$obj->var1->var2[2]->method1()->var3['test']['test2']->method2()
。
这不支持嵌套括号。即$obj->var1[$obj2->var1['one']]
要平衡括号,您需要使用正确的解析器
答案 2 :(得分:1)
答案 3 :(得分:0)
答案 4 :(得分:0)
尝试以下正则表达式:
\$.+?(?=,|\s|\])(?:\](?=\]))?
请参阅DEMO
根据您的示例输入,它将捕获:
$var1
$obj->var1['asd']
$var1
$obj->var1
$var1
$var2