Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Работа с url ( замена символов, кириллица, латиница) (https://javascript.ru/forum/misc/30180-rabota-s-url-zamena-simvolov-kirillica-latinica.html)

Elve 26.07.2012 23:53

Работа с url ( замена символов, кириллица, латиница)
 
Доброго времени суток, столкнулся с определенной задачей решение которой не смог придумать сам и почерпнуть из интернета( к сожалению не так давно работаю с js). Суть задачи
1.Есть адрес страницы, которая пишется на транслите, но вот не задача, в конце в случае подключения фильтров на движке добавляется этот самый фильтр и он то как раз на русском( в итоге в конце строки нечто подобное 5%D1%80%D0%B5%D0%B2%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9) . Задача стоит просто: весь урл должен быть транслитом. Обшарил просторы интернета
function cyr2lat(str) {

    var cyr2latChars = new Array(
['а', 'a'], ['б', 'b'], ['в', 'v'], ['г', 'g'],
['д', 'd'],  ['е', 'e'], ['ё', 'yo'], ['ж', 'zh'], ['з', 'z'],
['и', 'i'], ['й', 'y'], ['к', 'k'], ['л', 'l'],
['м', 'm'],  ['н', 'n'], ['о', 'o'], ['п', 'p'],  ['р', 'r'],
['с', 's'], ['т', 't'], ['у', 'u'], ['ф', 'f'],
['х', 'h'],  ['ц', 'c'], ['ч', 'ch'],['ш', 'sh'], ['щ', 'shch'],
['ъ', ''],  ['ы', 'y'], ['ь', ''],  ['э', 'e'], ['ю', 'yu'], ['я', 'ya'],

['А', 'A'], ['Б', 'B'],  ['В', 'V'], ['Г', 'G'],
['Д', 'D'], ['Е', 'E'], ['Ё', 'YO'],  ['Ж', 'ZH'], ['З', 'Z'],
['И', 'I'], ['Й', 'Y'],  ['К', 'K'], ['Л', 'L'],
['М', 'M'], ['Н', 'N'], ['О', 'O'],  ['П', 'P'],  ['Р', 'R'],
['С', 'S'], ['Т', 'T'],  ['У', 'U'], ['Ф', 'F'],
['Х', 'H'], ['Ц', 'C'], ['Ч', 'CH'], ['Ш', 'SH'], ['Щ', 'SHCH'],
['Ъ', ''],  ['Ы', 'Y'],
['Ь', ''],
['Э', 'E'],
['Ю', 'YU'],
['Я', 'YA'],

['a', 'a'], ['b', 'b'], ['c', 'c'], ['d', 'd'], ['e', 'e'],
['f', 'f'], ['g', 'g'], ['h', 'h'], ['i', 'i'], ['j', 'j'],
['k', 'k'], ['l', 'l'], ['m', 'm'], ['n', 'n'], ['o', 'o'],
['p', 'p'], ['q', 'q'], ['r', 'r'], ['s', 's'], ['t', 't'],
['u', 'u'], ['v', 'v'], ['w', 'w'], ['x', 'x'], ['y', 'y'],
['z', 'z'],

['A', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D'],['E', 'E'],
['F', 'F'],['G', 'G'],['H', 'H'],['I', 'I'],['J', 'J'],['K', 'K'],
['L', 'L'], ['M', 'M'], ['N', 'N'], ['O', 'O'],['P', 'P'],
['Q', 'Q'],['R', 'R'],['S', 'S'],['T', 'T'],['U', 'U'],['V', 'V'],
['W', 'W'], ['X', 'X'], ['Y', 'Y'], ['Z', 'Z'],

[' ', '-'],['0', '0'],['1', '1'],['2', '2'],['3', '3'],
['4', '4'],['5', '5'],['6', '6'],['7', '7'],['8', '8'],['9', '9'],
['-', '-']

    );

    var newStr = new String();

    for (var i = 0; i < str.length; i++) {

        ch = str.charAt(i);
        var newCh = '';

        for (var j = 0; j < cyr2latChars.length; j++) {
            if (ch == cyr2latChars[j][0]) {
                newCh = cyr2latChars[j][1];

            }
        }
        // Если найдено совпадение, то добавляется соответствие, если нет - пустая строка
        newStr += newCh;

    }
    // Удаляем повторяющие знаки - Именно на них заменяются пробелы.
    // Так же удаляем символы перевода строки, но это наверное уже лишнее
    return newStr.replace(/[-]{2,}/gim, '-').replace(/\n/gim, '');
}

Вот и возникает вопрос как сделать замену урла на ходу, потому что я не вижу строки которая это делает...
Буду признателен если поможете новичку и не будите сильно пинать и буду очень благодарен если еще и подскажите :help:

Deff 26.07.2012 23:58

Цитата:

Сообщение от Elve
1.Есть адрес страницы, которая пишется на транслите, но вот не задача, в конце в случае подключения фильтров на движке добавляется этот самый фильтр и он то как раз на русском. Задача стоит просто: весь урл должен быть транслитом. Обшарил просторы интернета

Приведите с пяток ссылок

Elve 27.07.2012 00:07

Прошу прощения но название сайта я заменил
example.ru/catalog/konstruktory?163=%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1 %8F%D0%BD%D0%BD%D1%8B%D0%B9
то что идет после ?163= в оригинале выглядело так ?163=деревянный
example.ru/catalog/konstruktory?163=%D0%BB%D0%B0%D0%B1%D0%B8%D1%80%D0 %B8%D0%BD%D1%82

example.ru/catalog/konstruktory?163=%D0%BF%D0%BB%D0%B0%D1%81%D1%82%D0 %B8%D0%BA%D0%BE%D0%B2%D1%8B%D0%B9&153=City&152=%D0 %B0%D1%8D%D1%80%D0%BE%D0%BF%D0%BE%D1%80%D1%82
Последняя ссылка это 3 активных фльтра 2 из них на русском и выглядело так
example.ru/catalog/konstruktory?163=пластиковый&153=City&1 52=аэропорт

Deff 27.07.2012 00:14

Elve,
Дык а чем плохо в URIcomponent ?

Надо отметить, что все get - запросы передаются подобных образом и если движок кривит - нун править движок - а не костыли вставлять на клиенте

Elve 27.07.2012 00:32

Вопрос как всегда ставиться в принудительном наклонении... Я к сожалению с пхп не знаком совершенно, поэтому править сам движок не в моей власти, но мне подсказали добрые люди :thanks: , что мою задачу можно решить на js. Вот и стал вопрос о поиске решения с коим я и явился в ваш храм знаний и мудрости

Deff 27.07.2012 00:51

Elve,
Пробелы на что меняем ?

Elve 27.07.2012 11:30

на _

Elve 27.07.2012 16:38

Ап:cray: Неужели это большая редкость подобная задача?

Deff 27.07.2012 19:02

Elve,
Просто жарко - завтра сделаю

Elve 27.07.2012 20:09

Deff,
Буду очень признателен:dance:

devote 27.07.2012 23:18

function toTranslit( text ) {
	return text.replace( /([а-яё])/gi, function( all, char ) {
		var code = char.charCodeAt(0),
			index = code == 1025 || code == 1105 ? 0 : code > 1071 ? code - 1071 : code - 1039,
			t = ['yo','a','b','v','g','d','e','zh','z','i','y','k','l','m','n','o','p',
			'r','s','t','u','f','h','c','ch','sh','shch','','y','','e','yu','ya'];

		return char.toUpperCase() === char ? t[ index ].toUpperCase() : t[ index ];
	});
}

alert( toTranslit( "абвгдеёжзийклмнопрстуфхцчшщъыьэюя АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" ) );

alert( toTranslit( "Доброго времени суток, столкнулся с определенной задачей решение которой не смог придумать сам" ) );

Deff 27.07.2012 23:21

devote,
Тут по ходу самая сложность не в кирилице - а декодировке get запроса

devote 27.07.2012 23:23

Цитата:

Сообщение от Deff
Тут по ходу самая сложность не в кирилице - а декодировке get запроса

ну дык unescape/decodeURIComponent и т.д. Не?

devote 27.07.2012 23:24

я вопроса совсем не понял если честно.. он хочет менять ссылку в адресной строке чтоль? или что?

Deff 27.07.2012 23:31

<script type="text/javascript">
function ChangLat (str){
var A = " абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
var B = "_'a'b'v'g'd'e'yo'zh'z'i'y'k'l'm'n'o'p'r's't'u'f'h'c'ch'sh'shch''y''e'yu'\
ya'A'B'V'G'D'E'YO'ZH'Z'I'Y'K'L'M'N'O'P'R'S'T'U'F'H'C'CH'SH'SHCH''Y''E'YU'YA";
  A = A.split('');
  B = B.split("'");
  str=str.split('');
  Lng = str.length;
  for(i=0; i < Lng; i++){
     for(j=0; j < A.length; j++){
       if(str[i]==A[j]){str[i]=B[j];break;}
     }
  } return str.join('');
}

function ChangeRus(a) {
   a.value = ChangLat(a.value);
}
</script>

Привет! volky; <br />
 <input id="hash-parametr-str" name="hash" type="text" size="40" onmouseout="ChangeRus(this)" onmouseover="ChangeRus(this)" onchange="ChangeRus(this)">

Совместимо с ие 6-7 (Cделал часа два назад - застрял с URL

Ксать - запятая еще не в кассу

Elve 28.07.2012 13:56

Deff,
Спасибо за проделанную работу, а вы можете объяснить как этот скрипт прикрутить к странице, чтобы он урл заменял... А то тут инпуты алерты... А мне по сути надо чтобы он выхватил урл, пробежался по нему и если бы встречал русский символ заменял его на латинский...
По сути организация новой ссылки работает так
<a href="{url params=[$f->id=>$o->value, page=>null]}" title="{$o->value|escape}">{$o->value|escape}</a>

если я прямо тут применю замену ссылки, то меня скорее всего кинет на 404 страницу( если я все правильно понимаю) И в принципе как можно применить функцию написанную вами выше к такой строке? Я пробовал
<a href="{url ChangLat(params=[$f->id=>$o->value, page=>null])}" title="{$o->value|escape}">{$o->value|escape}</a>

Deff 28.07.2012 14:15

Elve,
10 типовых ссылок приведите, (*поскольку то что Вы привели, - отнюдь не русский, а encodeURI

Elve 28.07.2012 15:15

Я уже приводил ссылки в начале темы, или их недостаточно? Почему я говорю о кирилице - потому, что в адресе в браузере я вижу русский, нокогда копирую оттуда получаю encodeURI

Deff 28.07.2012 15:47

Цитата:

Сообщение от Elve
Я уже приводил ссылки в начале темы, или их недостаточно? Почему я говорю о кирилице - потому, что в адресе в браузере я вижу русский, нокогда копирую оттуда получаю encodeURI

В каком браузере ? - войдите с Opera

Elve 28.07.2012 18:55

В лисе, в хроме русский, в опере сразу в encodeURI


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