Javascript Slug 也适用于非拉丁字符

Posted

技术标签:

【中文标题】Javascript Slug 也适用于非拉丁字符【英文标题】:Javascript Slug working for non latin characters also 【发布时间】:2019-07-11 15:22:43 【问题描述】:

基本上我找到了一个如下所示的 slug 函数:

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 | ты знаешь, что идет дождь? | ты-знаешь-что-идет-дождь

注意:

基本上对于拉丁字母,我会保留字母但删除变音符号,但对于非拉丁字母,我会保持原样(我不想将它们转换为拉丁字符)

【问题讨论】:

另见:***.com/questions/13309620/… 【参考方案1】:

这是一个适用于特殊字符的pproach。使用一组对象,您可以将要替换的每个特殊字符归类为将替换它的拉丁字符。

但是,要保持希腊语和俄语不变,您必须使用将希腊语和俄语视为单词字符的正则表达式,因此在使用上述技巧替换特殊字符后,您必须使用以下方法删除所有非单词字符正则表达式[^-a-zа-я\u0370-\u03ff\u1f00-\u1fff].

此正则表达式包括破折号、拉丁字符 a-z,后跟西里尔字母 а-я,最后是 \u0370-\u03ff\u1f00-\u1fff,这是 greek characters 的扩展 unicode 范围。

您可以使用此wikipedia language recognition chart 向集合中添加更多特殊字符。

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('ἀεὶ Λιβύη φέρει τι καινόν'));

【讨论】:

您好,感谢您的工作和回答。也许我不是很清楚。基本上对于俄语,我想将他们的字母保留在 URL 中。我只想从拉丁字母中删除变音符号。所以基本上我想将 ă 转换为 a,但 Б 我想保持它像这样 Б。 (漂亮的网址,让俄罗斯人更好地理解网址) 好的,我明白了,那么上面的第一个 sn-p 仍然可以工作,您只需从列表中删除 russian 不,实际上它不起作用,只是检查。非拉丁词被剥离。 您好,感谢您的帮助。我现在会检查你的答案,然后回复。所以基本上这就是正确的伎俩吗? [^а-яα-ωa-z-]+ 基本上考虑了希腊语、俄语和拉丁语字符,对吧? 是的,一个用于拉丁字符的范围,一个用于希腊语,一个用于俄语。我也为希腊字母添加了一个示例,它去除了重音符号。

以上是关于Javascript Slug 也适用于非拉丁字符的主要内容,如果未能解决你的问题,请参考以下文章

姜戈。非 ascii 字段不会创建 slug。我希望得到音译,但得到一个空字段和错误

Visual Studio 2008 Profiler 是不是适用于非托管 C++?

适用于非 UI 人员的简单 Web UI 工具 [关闭]

非拉丁键盘上的键盘快捷键/命令 (JavaScript)

Swift @escaping 仅适用于非空函数参数?

csharp 此版本适用于非多行文本框