Для PHP вы можете использовать рекурсию в регулярных выражениях, которые почти дают вам то, что вы хотите:
$s = 'abc [one[two]][three] def';
$matches = array();
preg_match_all('/\[(?:[^][]|(?R))*\]/', $s, $matches);
print_r($matches);
Результат:
Array
(
[0] => Array
(
[0] => [one[two]]
[1] => [three]
)
)
Для чего-то более сложного, возможно, лучше не использовать регулярные выражения.