Skip to content

Instantly share code, notes, and snippets.

@alexeygritsenko
Created April 5, 2023 12:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexeygritsenko/89db1899d83b9c52c298f735d2d01110 to your computer and use it in GitHub Desktop.
Save alexeygritsenko/89db1899d83b9c52c298f735d2d01110 to your computer and use it in GitHub Desktop.
Translit Cyrillic to Seo URL
function toSeoUrl(string, lang = 'en') {
var delimiter = '-',
keyword = '',
abc = {
'ß': 'ss',
'à': 'a',
'á': 'a',
'â': 'a',
'ã': 'a',
'ä': 'a',
'å': 'a',
'æ': 'ae',
'ç': 'c',
'è': 'e',
'é': 'e',
'ê': 'e',
'ë': 'e',
'ì': 'i',
'í': 'i',
'î': 'i',
'ï': 'i',
'ð': 'd',
'ñ': 'n',
'ò': 'o',
'ó': 'o',
'ô': 'o',
'õ': 'o',
'ö': 'o',
'ő': 'o',
'ø': 'o',
'ù': 'u',
'ú': 'u',
'û': 'u',
'ü': 'u',
'ű': 'u',
'ý': 'y',
'þ': 'th',
'ÿ': 'y',
'α': 'a',
'β': 'b',
'γ': 'g',
'δ': 'd',
'ε': 'e',
'ζ': 'z',
'η': 'h',
'θ': '8',
'ι': 'i',
'κ': 'k',
'λ': 'l',
'μ': 'm',
'ν': 'n',
'ξ': '3',
'ο': 'o',
'π': 'p',
'ρ': 'r',
'σ': 's',
'τ': 't',
'υ': 'y',
'φ': 'f',
'χ': 'x',
'ψ': 'ps',
'ω': 'w',
'ά': 'a',
'έ': 'e',
'ί': 'i',
'ό': 'o',
'ύ': 'y',
'ή': 'h',
'ώ': 'w',
'ς': 's',
'ϊ': 'i',
'ΰ': 'y',
'ϋ': 'y',
'ΐ': 'i',
'ş': 's',
'ı': 'i',
'ç': 'c',
'ü': 'u',
'ö': 'o',
'ğ': 'g',
'а': 'a',
'б': 'b',
'в': 'v',
'г': 'g',
'д': 'd',
'е': 'e',
'ё': 'yo',
'ж': 'zh',
'з': 'z',
'и': 'i',
'й': 'j',
'к': 'k',
'л': 'l',
'м': 'm',
'н': 'n',
'о': 'o',
'п': 'p',
'р': 'r',
'с': 's',
'т': 't',
'у': 'u',
'ф': 'f',
'х': 'h',
'ц': 'c',
'ч': 'ch',
'ш': 'sh',
'щ': 'sh',
'ъ': '',
'ы': 'y',
'ь': '',
'э': 'e',
'ю': 'yu',
'я': 'ya',
'є': 'ye',
'і': 'i',
'ї': 'yi',
'ґ': 'g',
'č': 'c',
'ď': 'd',
'ě': 'e',
'ň': 'n',
'ř': 'r',
'š': 's',
'ť': 't',
'ů': 'u',
'ž': 'z',
'ą': 'a',
'ć': 'c',
'ę': 'e',
'ł': 'l',
'ń': 'n',
'ó': 'o',
'ś': 's',
'ź': 'z',
'ż': 'z',
'ā': 'a',
'č': 'c',
'ē': 'e',
'ģ': 'g',
'ī': 'i',
'ķ': 'k',
'ļ': 'l',
'ņ': 'n',
'š': 's',
'ū': 'u',
'ž': 'z',
'ө': 'o',
'ң': 'n',
'ү': 'u',
'ә': 'a',
'ғ': 'g',
'қ': 'q',
'ұ': 'u',
'ა': 'a',
'ბ': 'b',
'გ': 'g',
'დ': 'd',
'ე': 'e',
'ვ': 'v',
'ზ': 'z',
'თ': 'th',
'ი': 'i',
'კ': 'k',
'ლ': 'l',
'მ': 'm',
'ნ': 'n',
'ო': 'o',
'პ': 'p',
'ჟ': 'zh',
'რ': 'r',
'ს': 's',
'ტ': 't',
'უ': 'u',
'ფ': 'ph',
'ქ': 'q',
'ღ': 'gh',
'ყ': 'qh',
'შ': 'sh',
'ჩ': 'ch',
'ც': 'ts',
'ძ': 'dz',
'წ': 'ts',
'ჭ': 'tch',
'ხ': 'kh',
'ჯ': 'j',
'ჰ': 'h'
};
switch (lang) {
case 'bg':
abc['щ'] = 'sht';
abc['ъ'] = 'a';
break;
case 'uk':
abc['и'] = 'y';
break;
}
string = string.toLowerCase();
for (var k in abc) {
string = string.replace(RegExp(k, 'g'), abc[k]);
}
var alnum = (typeof (XRegExp) === 'undefined') ? RegExp('[^a-z0-9]+', 'ig') : XRegExp('[^\\p{L}\\p{N}]+', 'ig');
string = string.replace(alnum, delimiter);
string = string.replace(RegExp('[' + delimiter + ']{2,}', 'g'), delimiter);
string = string.replace(RegExp('(^' + delimiter + '|' + delimiter + '$)', 'g'), '');
return string;
}
@alexeygritsenko
Copy link
Author

Пример использования:
toSeoUrl('Новости из мира игр: Rockstar договорились с моддерами в 2023 году');

результат

novosti-iz-mira-igr-rockstar-dogovorilis-s-modderami-v-2023-godu

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment