можно разбить на фрагменты и по ним построить дерево, приблизительно это можно сделать так:
alert(JSON.stringify("начало[tag=tagname1]text1[/tag]середина[tag=tagname2]text2[/tag]конец".split(/(?=\[.*?\])|(?=\])/)));
Можно так же воспользоваться решениями типа этого
https://github.com/Svoloch/js-text-tools
Только сразу предупреждаю, это будет не в пользу быстродействия.