В вашем вопросе не видно, какую «структуру совпадений» вы хотите ... Но вы можете использовать только простые массивы. Попробуйте
preg_match_all('#\[([a-z\)\(]+?)\]#',$original,$m);
, что для $original = 'bar[foo[test[abc][def]]bar]foo'
возвращает массив с "ABC" и "DEF", внутренних.
Для вашего вывода вам нужен цикл для «задачи синтаксического анализа». PCRE с preg_replace_callback лучше для синтаксического анализа.
Возможно, этот цикл является хорошей подсказкой для вашей проблемы,
$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
);
}
Результат (обратный вызов для печати):
[abc]
[def]
[test(abc)(def)]
[foo(test(abc)(def))bar]
-- bar(foo(test(abc)(def))bar)foo
Смотрите также this related question.
Возможный дубликат [Вложенные круглые скобки в массив с использованием регулярного выражения в PHP] (http://stackoverflow.com/questions/10361562/nested-parentheses-to-array-using-regex-in-php) –
Может ли когда-либо быть более одной пары внутри другой пары? например '[Foo [бар] [Баз] [XYZZY] лол]'? – leftclickben
Да, в идеале это может быть так. Я изменил вопрос, включив эту функциональность ... – Dylan