Me parece que estás haciendo mucho para algo más simple, con una expresión regular y preg_replace_callback() debería ser suficiente:
Código PHP:
Ver originalfunction procesar_tags($matches) {
list(, $tagName, $tagValue) = $matches;
return "<!-- aquí podría procesar: $tagName($tagValue) -->";
}
$regex = '/\[(\w+)\]([^[\]]+?)\[\/\\1\]/s';
$entrada = '[foo]a,b,c[/foo] y [x]yz[/x]';
echo $salida;
¿Se entiende la idea?