Javascript Slug 也适用于非拉丁字符
Javascript Slug working for non latin characters also
基本上我找到了一个看起来像这样的 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
| ты знаешь, что идет дождь?
| ты-знаешь-что-идет-дождь
注:
基本上对于拉丁字母我会保留字母但删除变音符号,但对于非拉丁字母我会保持字母原样(我不想将它们转换成拉丁字符)
这是一个适用于特殊字符的 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('ἀεὶ Λιβύη φέρει τι καινόν'));
基本上我找到了一个看起来像这样的 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
| ты знаешь, что идет дождь?
| ты-знаешь-что-идет-дождь
注:
基本上对于拉丁字母我会保留字母但删除变音符号,但对于非拉丁字母我会保持字母原样(我不想将它们转换成拉丁字符)
这是一个适用于特殊字符的 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('ἀεὶ Λιβύη φέρει τι καινόν'));