Транслитерация 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-представление массива, в котором приведены варианты транслитерации конкретного символа. Таким образом можно представить любую букву алфавита в любом "начертании", а при необходимости добавить новую схему трансляции. Единственное, что следует отслеживать, - это размерность всех массивов - она должна быть одинаковой.
|
при транслитерации русская буква "А" не меняется на анг. букву "А".
вот пример, забил в скрипт слово "канцтовары"
скрипт выдал: "kаnctovаry",
отправил слово в яндекс
http://yandex.by/yandsearch?text=k%D0%B0nctov%D0%B0ry&clid=13999&tld=by&...
обратите внимание на урл "k%D0%B0nctov%D0%B0ry"
Спасибо, поправил. Действительно упустил "=" в условии (cc>=1072)
Отладчик в отношении "if(ch.length<3)" пишет "Не удалось получить значение свойства "length": значением объекта является NULL или он не определен"
Поправка - ошибка наблюдается только в IE all
Если нажать на кнопку "Проверить", все работает в IE, но если скопировать код, то не работает...
Если бы еще скрипт убирал все небуквенные символы, т.е. оставлял бы только [a-zA-Z0-9\-_] вообще цены бы не было
Проблема неоднозначности:
в здоровом теле здоровый дух -> хоть мясо протухо, но запах все еще свежий
пример: мать -> mat -> мат
как с этим бороться?
спасибо то что нужно
На основе этой функи накидал просто функу для транслитерации текста.
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. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.