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 - 17: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 - 04:36
#permalink

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


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

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


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

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


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

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


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

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


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

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

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

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

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


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

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


Автор: Гость (не зарегистрирован), дата: 28 сентября, 2011 - 12: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;
};

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

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
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
Антиспам
7 + 13 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
javs
Реклама

Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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