Dmitrij_Kh, вы не сможете в данном случае транслитерированный текст восстановить обратно, поскольку у вас: 1) происходит удаление символов, 2) некоторые транслитерированные символы имеют одинаковое значение. Вам лучше смотреть на эту проблему так — есть текст-источник, и есть преобразованный текст.
<form onsubmit="return false;" oninput="_translate(this);">
<input type="text" name="text" />
<label>
<input name="transliterate" type="checkbox" checked />
Транслитерация
</label>
<output name="transliterated-text"></output>
</form>
<script>
const purgeText = string => string.replace(/(^\s+)|'|"|<|>|\!|\||@|#|$|%|^|\^|\$|\\|\/|&|\*|\(\)|\|\/|;|\+|№|,|\?|:|{|}|\[|\]/g, "");
const textTransform = originalText => {
let arrCyr = "Я,я,Ю,ю,Ч,ч,Ш,ш,Щ,щ,Ж,ж,А,а,Б,б,В,в,Г,г,Д,д,Е,е,Ё,ё,З,з,И,и,Й,й,К,к,Л,л,М,м,Н,н,О,о,П,п,Р,р,С,с,Т,т,У,у,Ф,ф,Х,х,Ц,ц,Ы,ы,Ь,ь,Ъ,ъ,Э,э, ".split(",");
let arrLat = "Ya,ya,Yu,yu,Ch,ch,Sh,sh,Sh,sh,Zh,zh,A,a,B,b,V,v,G,g,D,d,E,e,YO,yo,Z,z,I,i,J,j,K,k,L,l,M,m,N,n,O,o,P,p,R,r,S,s,T,t,U,u,F ,f,H,h,C,c,Y,y,,,,,E,e,".split(",");
let text = originalText;
for (let i = 0; i < arrCyr.length; i++)
text = text.replace(new RegExp(arrCyr[i], "g"), arrLat[i]);
return purgeText(text).toUpperCase();
};
function _translate(form) {
const text = form.elements.text.value;
const sholdBeTransliterated = form.elements.transliterate.checked;
const output = form.elements["transliterated-text"];
output.value = sholdBeTransliterated ? textTransform(text) : text;
}
</script>
<style>
form {
display: grid;
max-width: 30em;
}
form output {
border-top: thin dashed #789;
padding-top: 1em;
margin-top: 1em;
}
</style>