Javascript Slug работает и для нелатинских символов - PullRequest
0 голосов
/ 18 февраля 2019

В основном я обнаружил функцию слага, которая выглядит следующим образом:

function slug(string) => { 
    return string.toString().toLowerCase()
        .replace(/\s+/g, '-')
        .replace(/[^\w\-]+/g, '')
        .replace(/\-\-+/g, '-')
        .replace(/^-+/, '')
        .replace(/-+$/, '');
};

Однако она не работает для русских, греческих, ... символов.В основном они удаляются на этом этапе .replace(/[^\w\-]+/g, ''), что мне не нужно, но я также хочу удалить другие специальные символы, которые не представляют нормальные буквы в некоторых странах.

Пример:

English |Do you know it rains? |do-you-know-it-rains

Czech |víš, že prší? |vis-ze-prsi

Romanian |Ști că plouă? |sti-ca-ploua

Russian |ты знаешь, что идет дождь? |ты-знаешь-что-идет-дождь

Примечание:

В основном для латинского алфавита я буду сохранять буквы, но удаляю диакритические знаки, но для нелатинского алфавита я буду сохранять буквы такими, как ониявляются (я не хочу конвертировать их в латинские буквы)

1 Ответ

0 голосов
/ 18 февраля 2019

Вот pproach , который работает для специального символа.Используя набор объектов, вы классифицируете каждый специальный символ, который хотите заменить, под латинским символом, который его заменит.

Однако, чтобы оставить греческий и русский язык без изменений, вы должны использовать регулярное выражение, которое учитывает греческий и русский языки.в качестве символов слова, поэтому после замены специальных символов с помощью описанного выше трюка необходимо удалить все несловарные символы, используя следующее регулярное выражение [^-a-zа-я\u0370-\u03ff\u1f00-\u1fff].

Это регулярное выражение включает тире, латинские символы a-zсопровождаемый кириллицей а-я и, наконец, \u0370-\u03ff\u1f00-\u1fff, который является расширенным диапазоном юникода для греческих символов .

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

function slugify(text) {
  text = text.toString().toLowerCase().trim();

  const sets = [
    {to: 'a', from: '[ÀÁÂÃÄÅÆĀĂĄẠẢẤẦẨẪẬẮẰẲẴẶἀ]'},
    {to: 'c', from: '[ÇĆĈČ]'},
    {to: 'd', from: '[ÐĎĐÞ]'},
    {to: 'e', from: '[ÈÉÊËĒĔĖĘĚẸẺẼẾỀỂỄỆ]'},
    {to: 'g', from: '[ĜĞĢǴ]'},
    {to: 'h', from: '[ĤḦ]'},
    {to: 'i', from: '[ÌÍÎÏĨĪĮİỈỊ]'},
    {to: 'j', from: '[Ĵ]'},
    {to: 'ij', from: '[IJ]'},
    {to: 'k', from: '[Ķ]'},
    {to: 'l', from: '[ĹĻĽŁ]'},
    {to: 'm', from: '[Ḿ]'},
    {to: 'n', from: '[ÑŃŅŇ]'},
    {to: 'o', from: '[ÒÓÔÕÖØŌŎŐỌỎỐỒỔỖỘỚỜỞỠỢǪǬƠ]'},
    {to: 'oe', from: '[Œ]'},
    {to: 'p', from: '[ṕ]'},
    {to: 'r', from: '[ŔŖŘ]'},
    {to: 's', from: '[ߌŜŞŠȘ]'},
    {to: 't', from: '[ŢŤ]'},
    {to: 'u', from: '[ÙÚÛÜŨŪŬŮŰŲỤỦỨỪỬỮỰƯ]'},
    {to: 'w', from: '[ẂŴẀẄ]'},
    {to: 'x', from: '[ẍ]'},
    {to: 'y', from: '[ÝŶŸỲỴỶỸ]'},
    {to: 'z', from: '[ŹŻŽ]'},
    {to: '-', from: '[·/_,:;\']'}
  ];

  sets.forEach(set => {
    text = text.replace(new RegExp(set.from,'gi'), set.to)
  });

  return text
    .replace(/\s+/g, '-')    // Replace spaces with -
    .replace(/[^-a-zа-я\u0370-\u03ff\u1f00-\u1fff]+/g, '') // Remove all non-word chars
    .replace(/--+/g, '-')    // Replace multiple - with single -
    .replace(/^-+/, '')      // Trim - from start of text
    .replace(/-+$/, '')      // Trim - from end of text
}

console.log(slugify('Do you know it rains?'));
console.log(slugify('víš, že prší?'));
console.log(slugify('Ști că plouă?'));
console.log(slugify('ты знаешь, что идет дождь?'));
console.log(slugify('ἀεὶ Λιβύη φέρει τι καινόν'));
...