Is not evident in your question what kind of "structure of matches" you whant... But you can use only simple arrays. Try
preg_match_all('#\[([a-z\)\(]+?)\]#',$original,$m);
that, for $original = 'bar[foo[test[abc][def]]bar]foo'
returns an array with "abc" and "def", the inner ones.
For your output, you need a loop for the "parsing task".
PCRE with preg_replace_callback is better for parsing.
Perhaps this loop is a good clue for your problem,
$original = 'bar[foo[test[abc][def]]bar]foo';
for( $aux=$oldAux=$original;
$oldAux!=($aux=printInnerBracket($aux));
$oldAux=$aux
);
print "\n-- $aux";
function printInnerBracket($s) {
return preg_replace_callback(
'#\[([a-z\)\(]+?)\]#', // the only one regular expression
function($m) {
print "\n$m[0]";
return "($m[1])";
},
$s
);
}
Result (the callback print):
[abc]
[def]
[test(abc)(def)]
[foo(test(abc)(def))bar]
-- bar(foo(test(abc)(def))bar)foo
See also this related question.
[foo[bar][baz][xyzzy]lol]
? – Receptor