io per ora mi sono creato questo ma non è testatissimo
codice:
<script>
function replaceByModel(txt,model,tag){
	nuovo="";
	for(i=0;i<tag.length;i++){
		tag_ini_pos_txt=-1;
		tag_ini_pos_mod=-1;
		tag_fin_pos_txt=0;
		tag_fin_pos_mod=0;
		while(txt.indexOf(tag[i].inizio,tag_ini_pos_txt+1)!=-1){
			tag_ini_pos_txt=txt.indexOf(tag[i].inizio,tag_ini_pos_txt+1);
			tag_ini_pos_mod=model.indexOf(tag[i].inizio,tag_ini_pos_mod+1);
			tag_fin_pos_txt=txt.indexOf(tag[i].fine,tag_fin_pos_txt)+tag[i].fine.length;
			
			nuovo+=model.substr(tag_fin_pos_mod,tag_ini_pos_mod-tag_fin_pos_mod);
			nuovo+=txt.substr(tag_ini_pos_txt,tag_fin_pos_txt-tag_ini_pos_txt);
			
			tag_fin_pos_mod=model.indexOf(tag[i].fine,tag_fin_pos_mod)+tag[i].fine.length;
		}
	}
	return nuovo;
}

var testo = "prova [tag]x[/tag] prova di testo [tag]y[/tag]";
var modello = "prova1 [tag][/tag] prova di articolo [tag][/tag]";

alert(replaceByModel(testo,modello,[{inizio:"[tag]",fine:"[/tag]"}]));
</script>