Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Динамичная транслитерация рус-en (https://javascript.ru/forum/misc/5074-dinamichnaya-transliteraciya-rus-en.html)

Georgiy 12.09.2009 21:06

Динамичная транслитерация рус-en
 
Нашёл хороший скрипт:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Translit</title>
<script type="text/javascript">
/* Javascript functions */
function JSfunc()
{
	/* Making transliteration! */
	this.strTranslit = function(el)
	{
		new_el = document.getElementById('out');
		A = new Array();
		A["Ё"]="YO";A["Й"]="I";A["Ц"]="TS";A["У"]="U";A["К"]="K";A["Е"]="E";A["Н"]="N";A["Г"]="G";A["Ш"]="SH";A["Щ"]="SCH";A["З"]="Z";A["Х"]="H";A["Ъ"]="'";
		A["ё"]="yo";A["й"]="i";A["ц"]="ts";A["у"]="u";A["к"]="k";A["е"]="e";A["н"]="n";A["г"]="g";A["ш"]="sh";A["щ"]="sch";A["з"]="z";A["х"]="h";A["ъ"]="'";
		A["Ф"]="F";A["Ы"]="I";A["В"]="V";A["А"]="A";A["П"]="P";A["Р"]="R";A["О"]="O";A["Л"]="L";A["Д"]="D";A["Ж"]="ZH";A["Э"]="E";
		A["ф"]="f";A["ы"]="i";A["в"]="v";A["а"]="a";A["п"]="p";A["р"]="r";A["о"]="o";A["л"]="l";A["д"]="d";A["ж"]="zh";A["э"]="e";
		A["Я"]="YA";A["Ч"]="CH";A["С"]="S";A["М"]="M";A["И"]="I";A["Т"]="T";A["Ь"]="'";A["Б"]="B";A["Ю"]="YU";
		A["я"]="ya";A["ч"]="ch";A["с"]="s";A["м"]="m";A["и"]="i";A["т"]="t";A["ь"]="'";A["б"]="b";A["ю"]="yu";
		new_el.value = el.value.replace(/([\u0410-\u0451])/g,
			function (str,p1,offset,s) {
				if (A[str] != 'undefined'){return A[str];}
			}
		);
	}
	/* Normalizes a string, eю => eyu */
	this.strNormalize = function(el)
	{
		if (!el) { return; }
		this.strTranslit(el);
	}
}
var oJS = new JSfunc();
</script>
</head>
<body>

<p>введите текст:</p>
<textarea onkeyup="oJS.strNormalize(this)" style="height:10em;width:100%" id="in"></textarea>
<p>результат:</p>
<textarea style="height:10em;width:100%" id="out"></textarea>

</body>
</html>


подскажите как нужно дополнить скрипт, чтобы при вводе пробела, он был заменён на _ (нижнее подчёркивание).

Цель: для ЧПУ

Gvozd 12.09.2009 22:56

Здравствуйте!

Судя по вашему сообщению, вы ну совсем не знаете javascript.

Освойте основы языка и вопрос отпадет сам, полностью или частично.
А с чем не справитесь - поможем.

На сайте javascript можно начать изучать с учебника, раздел Основы javascript.
Возможно, вам также понадобится HTML - учебник есть, например, здесь: http://ru.html.net/tutorials/html/

Задавайте конкретные вопросы по ходу дела.

Georgiy 13.09.2009 10:53

Цитата:

Сообщение от Gvozd (Сообщение 30035)
Здравствуйте!

Судя по вашему сообщению, вы ну совсем не знаете javascript.

Задавайте конкретные вопросы по ходу дела.

Это точно - не знаю. Очень хочу изучить, но всё как-то пока не получается подойти к этому предмету... только подкрастся и взять какой-нить готовый скрипт - благо их сейчас много, однако в таких ситуациях как эта - нужно уметь исправить, а для этой ситуации - есть этот форум. Помню как-то на этом форуме мне подсказали, и я врубился в ту конкретную тему и теперь то что уже прошёл - знаю в javascript. Может так и научусь половине:)


Относительно этого скрипта - не понятно зачем Вы мне рекомендуете изучать html. Помоему он здесь в данном случае не нужен вовсе. Если поставить
A["&nbsp;"]="_";
то ничего не выйдет - я это без особых знаний понимаю и даже не пробовал этот вариант. Наивно попробовал
A[" "]="_";
- конечно не сработало. Пробел это же символ и его нужно указать. Потом я обнаружил, что если я перенесу строку, транслитерация также перенесётся синхронно на следующую строчку. Я прикинул что отвечает за это скорее всего строчка
new_el.value = el.value.replace(/([\u0410-\u0451])/g,

- но могу ошибаться..

А так как таких ньюансов я не ведаю, решил опоститься здесь чтобы мне кинули строчку символов обозначающую пробел и замены его на _
видел функцию str.replace(' ','_') но даже пробовать не рискнул - в js не так всё просто...

Riim 13.09.2009 11:31

Цитата:

Сообщение от Georgiy
не понятно зачем Вы мне рекомендуете изучать html

это RTFM.

Цитата:

Сообщение от Georgiy
видел функцию str.replace(' ','_') но даже пробовать не рискнул - в js не так всё просто...

попробуй.

Gvozd 13.09.2009 11:47

Цитата:

Сообщение от Georgiy
и даже не пробовал этот вариант.

Цитата:

Сообщение от Georgiy
даже пробовать не рискнул

что ж вы такой не уверенный-то?)
от того, что вы попробуете пускай даже бредовую идею, ничего страшного тут не случится
Цитата:

Сообщение от Georgiy
видел функцию str.replace(' ','_')

ну, вполне можно было использовать
только в виде:
new_el.value = el.value.replace(/([\u0410-\u0451])/g,
            function (str,p1,offset,s) {
                if (A[str] != 'undefined'){return A[str];}
            }
        ).replace(/ /g,'_');//символ g использован для того чтобы заменять все пробелы, а не только первый

Но это скорее костыль
правильно будет так сделать:
Цитата:

Сообщение от Georgiy
A[" "]="_";

(вы двигались в верном направлении)
и
new_el.value = el.value.replace(/([\u0410-\u0451 ])/g,//обратите внимание на пробел перед закрывающей квадратной скобкой.
                                                                          //благодаря ему и работает
            function (str,p1,offset,s) {
                if (A[str] != 'undefined'){return A[str];}
            }
        );

суть в том, что мы расширили символьный класс [\u0410-\u0451] до [\u0410-\u0451 ], добавив пробел в качестве символа для поиска
для того, чтобы понять как вообще работают регулярные выражения в JS, рекомендую ознакомится со статьями
http://javascript.ru/basic/regular-expression
http://javascript.ru/RegExp

Georgiy 13.09.2009 13:42

Цитата:

Сообщение от Gvozd (Сообщение 30050)
что ж вы такой не уверенный-то?)

Опыт. Когда cуёшся без консультации в тему которую не понимаешь - потратишь много времени. А я из-за своей упрямости если засяду, то вылезу на второй день, но сделаю. Вот этой глупой потери времени мне не нужно, если есть тематические форумы.


Цитата:

Сообщение от Gvozd (Сообщение 30050)
суть в том, что мы расширили символьный класс [\u0410-\u0451] до [\u0410-\u0451 ], добавив пробел в качестве символа для поиска
для того, чтобы понять как вообще работают регулярные выражения в JS, рекомендую ознакомится со статьями
http://javascript.ru/basic/regular-expression
http://javascript.ru/RegExp

Прекрасно. Поставил пробел и теперь происходит замена на "ничто".
Я считаю что для этой задачи такому специалисту как-то скудненько отсылать на изучение литературы, в которой только 0.0001% материала будет полезно для этого решения.

Не понимаю, сложно что-ли кинуть строку как заменить в готовом скрипте " " на "_"? Я конечно благодарю Вас о такой заботе чтобы я больше знал, но как-то странно для спецов создавать такой ахиренный форум на таком ахиренном домене и постоянно в топиках произносить "RTFM"!

Riim 13.09.2009 14:20

заменить
Цитата:

Сообщение от Georgiy
\u0410-\u0451

на [\u0020\u0410-\u0451]
и добавить
Цитата:

Сообщение от Georgiy
A[" "]="_";

вроде должно заработать.

Gvozd 13.09.2009 15:02

Georgiy,
читайте внимательно для начала сообщения
я написал
Цитата:

Сообщение от Gvozd
правильно будет так сделать:
Цитата:

Сообщение от Georgiy
A[" "]="_";

(вы двигались в верном направлении)
и
new_el.value = el.value.replace(/([\u0410-\u0451 ])/g,//обратите внимание на пробел перед закрывающей квадратной скобкой.
                                                                          //благодаря ему и работает
            function (str,p1,offset,s) {
                if (A[str] != 'undefined'){return A[str];}
            }
        );

частичка и указывает на то, что выполнить надо оба действия

более того, мой первый, "костыльный" вариант также работает, и уж его не суметь вставить у вас не могло получится

PS
Цитата:

Сообщение от Georgiy
как-то странно для спецов создавать такой ахиренный форум на таком ахиренном домене и постоянно в топиках произносить "RTFM"!

http://phpclub.ru/faq/WhyForum

Georgiy 13.09.2009 15:29

спасибо, работает! ОГРОМНОЕ СПАСИБО!

Цитата:

Сообщение от Gvozd (Сообщение 30060)

Цитата:

Форум нужен для того, чтобы Вы САМИ нашли ответ на свой вопрос.
Согласен. Поэтому мы пользователи стараемся называть темы топиков как можно детальнее, и раскрывать сущность вопроса сжато и подробно, чтобы другие пользователи могли найти ваш прекрасный форум в поисковиках, тем самым поднимая рейтинг форума и быть жутко благодарными за найденный ответ. Я всегда стараюсь сначала найти по разным ключевикам похожую проблему, а если не нахожу, универсалю тему и тем самым получаю ответ, который послужит другим пользователям. Тем кто задаёт вопросы до поиска вопросы, или просто ленятся, или на сайте какая-нибудь муть с поиском.

Цитата:

Форум нужен для того, чтобы Вы САМИ опубликовали на нем ответ на вопрос, интересный многим.
Согласен. Потому считаю разводить темы типа "смотри документацию" со ссылкой на скачивание целой книги на конкретный вопрос крайне нерационально. Кто не любит свою сферу деятельности - тот всегда молчит. Кто уважает программирование, с радостью погоняет импульсы по нейронам.

Цитата:

Форум НЕ предназначен для того, чтобы КТО-ТО нашёл за Вас ответ на Ваш вопрос или решил за Вас Вашу проблему.
Этот тезис логически противоречит двум вышесказанным. Как-то один знакомый сказал (не в обиду) - "хочешь секса в гамаке стоя на лыжах, напевая песню "Матушка Россия" в обратном порядке, - учавствуй на форуме phpclub.ru"

Riim 13.09.2009 17:00

Цитата:

Сообщение от Georgiy
Этот тезис логически противоречит двум вышесказанным.

Смотря как их понимать, первый можно понимать так: возникает интересный вопрос, спрашиваешь на форуме и !сам! продолжаешь искать, далее отвечаешь на свой же вопрос. Второй тезис можно понимать так же. Теперь ничто ничему не противоречит.


Часовой пояс GMT +3, время: 06:08.