Javascript.RU

Транслитерация URL

Еще одна небольшая "поделка" всего в 7 строк - на этот раз понадобилась транслитерация имени файла. Транслитерация URL является, с некоторых пор, весьма востребованной темой в среде специалистов по поисковой оптимизации.

Небольшое исследование, проведенное на тему правильной транслитерации url для сайта показало, что основные поисковые системы для российского сегмента Интернет - Яндекс и Google, несколько по-разному переводят русские буквы в английские аналоги.

Яндекс более вариативен, например всеми любимую букву "х" он сможет распознать, если она представлена любым из следующих английских вариантов "h,x,kh", Google предпочитает однозначное толкование - "h", однако вхождение поискового запроса в url типа "kharkov.ru" будет зачтено, при этом "k" просто отбросится. Таким образом для обоих поисковых систем транслитерация url домена, посвященного городу Харькову, с точки зрения SEO, будет идентичной. А вот для слова "сходка" подобный вариант с Google уже не пройдет.

Этот краткий экскурс в особенности транслитерации был затеян с одной целью - объяснить постановку решаемой задачи. Итак, имеем как минимум два варианта преобразования русских букв с возможным расширением количества толкований и толкователей, поэтому при реализации будет уместно использование массивов.

Далее, следует максимально синхронизировать оба набора символов, чтобы их воспринимали обе поисковые системы. После серии экспериментов по транслитерации, проведенных в Яндексе и Google, получим два набора, которые имеют всего два различия для букв "ж" и "щ".

Не знаю как вы, а я ёжиков уважаю, поэтому отдам должное ещё и русской букве "ё", а вот твердый и мягкий знаки, к сожалению, пришлось отбросить - при транслитерации url они бесполезны. В итоге получится следующее решение:

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
</head>
<body>
<script languaje="javascript">
function urlLit(w,v) {
*!*
 var tr='a b v g d e ["zh","j"] z i y k l m n o p r s t u f h c ch sh ["shh","shch"] ~ y ~ e yu ya ~ ["jo","e"]'.split(' ');
*/!*
 var ww=''; w=w.toLowerCase().replace(/ /g,'-');
 for(i=0; i<w.length; ++i) { 
   cc=w.charCodeAt(i); ch=(cc>=1072?tr[cc-1072]:w[i]); 
   if(ch.length<3) ww+=ch; else ww+=eval(ch)[v]; 
 }
 return(ww.replace(/~/g,''));
}

document.write(urlLit('абвгдеё жзийклмно прстуфхцч шщъыьэюя',0));
</script>
</body>
</html>

Переменная tr, объявленная в выделеной строке примера, допускает eval-представление массива, в котором приведены варианты транслитерации конкретного символа. Таким образом можно представить любую букву алфавита в любом "начертании", а при необходимости добавить новую схему трансляции. Единственное, что следует отслеживать, - это размерность всех массивов - она должна быть одинаковой.

+2

Автор: info1, дата: 9 ноября, 2010 - 16:55
#permalink

при транслитерации русская буква "А" не меняется на анг. букву "А".
вот пример, забил в скрипт слово "канцтовары"
скрипт выдал: "kаnctovаry",
отправил слово в яндекс
http://yandex.by/yandsearch?text=k%D0%B0nctov%D0%B0ry&clid=13999&tld=by&...

обратите внимание на урл "k%D0%B0nctov%D0%B0ry"


Автор: javs, дата: 29 декабря, 2010 - 03:36
#permalink

Спасибо, поправил. Действительно упустил "=" в условии (cc>=1072)


Автор: webymax (не зарегистрирован), дата: 30 апреля, 2011 - 14:01
#permalink

Отладчик в отношении "if(ch.length<3)" пишет "Не удалось получить значение свойства "length": значением объекта является NULL или он не определен"


Автор: webymax (не зарегистрирован), дата: 30 апреля, 2011 - 14:07
#permalink

Поправка - ошибка наблюдается только в IE all


Автор: webymax (не зарегистрирован), дата: 30 апреля, 2011 - 19:08
#permalink

Если нажать на кнопку "Проверить", все работает в IE, но если скопировать код, то не работает...


Автор: webymax (не зарегистрирован), дата: 30 апреля, 2011 - 14:24
#permalink

Если бы еще скрипт убирал все небуквенные символы, т.е. оставлял бы только [a-zA-Z0-9\-_] вообще цены бы не было


Автор: mc (не зарегистрирован), дата: 5 мая, 2011 - 22:17
#permalink

Проблема неоднозначности:

в здоровом теле здоровый дух -> хоть мясо протухо, но запах все еще свежий

пример: мать -> mat -> мат

как с этим бороться?


Автор: adam1 (не зарегистрирован), дата: 1 июля, 2011 - 15:08
#permalink

спасибо то что нужно


Автор: Гость (не зарегистрирован), дата: 28 сентября, 2011 - 11:46
#permalink

На основе этой функи накидал просто функу для транслитерации текста.

var transliterateString = function(str) {
	var tr='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 SCH \' Y \' E YU YA 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 sch \' y \' e yu ya e e'.split(' ');
	var result=''; 
	for(i=0; i<str.length; ++i){
		cc = str.charCodeAt(i); 
		result += (cc==1025 ? 'E' : (cc>=1040 ? tr[cc-1040] : str[i]));
	}
	return result;
};

Автор: Den Kulikoff (не зарегистрирован), дата: 4 июня, 2012 - 19:09
#permalink

Немного допилил функцию, вдруг кому пригодится.

Транслитерирует кириллицу, заменяет все спецсимволы на дефисы, удаляет повторяющиеся дефисы, обрезает девисы по краям (в моем случае подчеркивание тоже не должно проходить, так что оно тоже заменяется на дефис)

function urlLit(w,v) {
   var tr='a b v g d e ["zh","j"] z i y k l m n o p r s t u f h c ch sh ["shh","shch"] ~ y ~ e yu ya ~ ["jo","e"]'.split(' ');
   var ww=''; w=w.toLowerCase();
   for(i=0; i<w.length; ++i) {
     cc=w.charCodeAt(i); ch=(cc>=1072?tr[cc-1072]:w[i]);
     if(ch.length<3) ww+=ch; else ww+=eval(ch)[v];
   }
   return(ww.replace(/[^a-zA-Z0-9\-]/g,'-').replace(/[-]{2,}/gim, '-').replace( /^\-+/g, '').replace( /\-+$/g, ''));
 }

Автор: Гость (не зарегистрирован), дата: 20 июня, 2016 - 13:52
#permalink

Для украинского транслита переделал

function urlLit(w,v) {
   var tr='a b v h d e ["zh","j"] z y y k l m n o p r s t u f h c ch sh ["shh","shch"] ~ y ~ e yu ya ~ ["jo","e"] ["ye","ie"] '.split(' ');
   tr[36] = 'ye';
   tr[38] = 'i';
   tr[39] = 'i';
   tr[97] = 'g';
   var ww=''; w=w.toLowerCase();
   for(i=0; i<w.length; ++i) {
     cc=w.charCodeAt(i); 
     //return (cc);
     ch=(cc>=1072?tr[cc-1072]:w[i]);
     if(ch.length<3) ww+=ch; else ww+=eval(ch)[v];
   }
   return(ww.replace(/[^a-zA-Z0-9\-]/g,'-').replace(/[-]{2,}/gim, '-').replace( /^\-+/g, '').replace( /\-+$/g, ''));
 }

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
1 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
javs
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum