Вот вроде как че-то набросал тут, не могу сказать что это самое рациональное решение, но вроде как работает
Основная идея в том, что мы временно заменяем все смайлы уникальной маской из цифр, затем делаем транслит и меняем маски обратно
| Код | <script> function trans() { var map_en = new Array('s`h','S`h','S`H','s`Х','sh`','Sh`','SH`',"'o",'yo',"'O",'Yo','YO','zh','w','Zh','ZH','W','ch','Ch','CH','sh', 'Sh','SH','e`','E`',"'u",'yu',"'U",'Yu',"YU","'a",'ya',"'A",'Ya','YA','a','A','b','B','v','V','g','G','d','D','e','E','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',"'"); var map_ru = new Array('Сх','СХ','сХ','щ','Щ','Щ','ё','ё','Ё','Ё','Ё','ж','ж','Ж','Ж','Ж','ч','Ч','Ч','ш','Ш','Ш','э','Э','ю','ю','Ю','Ю','Ю','я','я','Я','Я','Я','а','А','б','Б', 'в','В','г','Г','д','Д','е','Е','з','З','и','И','й','Й','к','К','л','Л','м','М','н','Н','о','О','п','П','р','Р','с','С','т','Т','у','У','ф','Ф','х','Х','ц','Ц','ъ','ы','Ы','ь'); var str = "Soobwenie, kotoroe nado<img src=i/smiles/25.gif> perevesti <img src=i/smiles/23.gif> prodolzenie soobwe<img src=i/smiles/21.gif>nijaf qwe rqwer qwer qwe "; var strLen = str.length; // находим все смайлы и записываем их в массив var smileReg = /<img.*?>/g; var smilesTemp = new Array(); var smiles = new Array(); while ((smilesTemp = smileReg.exec(str)) != null) { smiles.push(smilesTemp[0]); } // создаем пары "маска" и "реальное значение" записываем в массив, тут же заменяем теги со смайлами на маски var imgMask = new Array(); for (var i = 0; i < smiles.length; i++) { var mask = generateMask(); str = str.replace(smiles[i], mask); imgMask.push(new Array(mask, smiles[i])); } // делаем транслит, к стати проверь свои массивы на соответствие, а то оно как-то странновато работает. Или у тебя бок или у меня, // но я массивы с твоими символами не проверял for (i = 0; i < map_en.length; i++) { var exp = eval('/'+map_en[i]+'/gm'); str = str.replace(exp, map_ru[i]); } // заменяем маски на реальные теги со смайлами for (i = 0; i < imgMask.length; i++) { str = str.replace(imgMask[i][0], imgMask[i][1]); } alert(str); } // генерирует маску function generateMask() { var food = '012345678901234567890123456789'; var mask = ''; var min_random = 0; var size = 12; var max_random = food.length - 1; var range = max_random - min_random; while (size != 0) { mask += food[Math.floor(Math.random() * range) + min_random]; size--; } return mask; } </script>
<input type="button" onclick="trans()">
|
если что не ясно - спрашивай |