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。我希望得到音译,但得到一个空字段和错误