Вообще такие вещи делаются
конечным автоматом, но по-быстрому можно и регуляркой нафигачить, как и все ребята выше
(версия игнорирующая незакрытые тэги и работающая со вложенностью):
var str = 'Оооочень большая строка текста, [color=красный]выделенный текст[/color], еще всякий текст текст текст [color=зелёный]еще выделенный текст[/color]! Ну и тд.';
var array_action = [];
var shift = 0;
var start = [];
var result = str.replace(/\[(\/?)color(?:\s*=\s*([^\]]+)\s*)?\]/g, function(full, end, color, index){
if(end){
if(end = start.pop()){
end.index_end_action = index - shift;
array_action.push(end);
}
} else {
start.push({
index_start_action: index - shift,
color: color
})
}
shift += full.length;
return '';
});
console.log(result, array_action);