带有非拉丁字符的 Javascript slug 函数
Posted
技术标签:
【中文标题】带有非拉丁字符的 Javascript slug 函数【英文标题】:Javascript slug function with non-latin chars 【发布时间】:2014-01-25 17:17:27 【问题描述】:我正在编写一个函数来从输入中生成 slug。
var vslug = function (str)
str = str.replace(/^\s+|\s+$/g, '');
str = str.toLowerCase();
var vregex = /(?:\.([^.]+))?$/;
var filename = str.replace(vregex.exec(str)[0],'');
var extension = vregex.exec(str)[1];
var from = "àáäâèéëêìíïîıòóöôùúüûñçşğ·/,:;";
var to = "aaaaeeeeiiiiioooouuuuncsg_____";
for (var i = 0; i < from.length; i++)
console.log('before ' + str);
str = filename.replace(new RegExp(from[i], 'g'), to[i]);
console.log('after ' + str);
str = str.replace(/[^a-z0-9 _-]/g, '')
.replace(/\s+/g, '_')
.replace(/-+/g, '_');
if (typeof extension !== "undefined")
return str+'.'+extension;
else
return str;
;
我无法完成这部分 - 我失明了。任何帮助表示赞赏..
var from = "àáäâèéëêìíïîıòóöôùúüûñçşğ·/,:;";
var to = "aaaaeeeeiiiiioooouuuuncsg_____";
for (var i = 0; i < from.length; i++)
console.log('before ' + str);
str = filename.replace(new RegExp(from[i], 'g'), to[i]);
console.log('after ' + str);
【问题讨论】:
【参考方案1】:filename
没有改变 - 变量名称相同的字符串,字符串不能被修改。因此,每个循环在使用 filename.replace..
时再次开始处理 original 字符串。
相反,消除filename
(或完全集成)并使用str = str.replace..
str = str.replace(vregex.exec(str)[0],'');
for (var i = 0; i < from.length; i++)
str = str.replace(new RegExp(from[i], 'g'), to[i]);
// ^-- next loop gets new value
(另外,这可以通过替换函数和映射而不是 n 循环来处理,并且可能有一个 javascript 的 Unicode 库可用..)
使用映射和替换函数的方法可能如下所示:
// Specify map somewhere reusable; can be built from paired arrays for simplicity.
var replacements = "à":"a", "á":"a", .. ";":"_"
// Object.keys is ES5, shim as needed. e.g. result: [à;á..]
var alternation = "[" + Object.keys(replacements).join("") + "]"
// This regex will match all characters we are trying to match.
var regex = new Regex(alternation, "g")
str = str.replace(regex, function (m)
var r = replacements[m]
return r || m
)
见String.replace(regex, function)
【讨论】:
谢谢 :) 工作。但是更进一步,如果您为地图使用提供照明,我会很高兴。如果您可以开始,我会使用它... @YahyaE 我添加了一个示例。 YMMV。 在对象中使用非拉丁字符作为键被认为是无效的,大写字母也可能存在问题。 @venimus 将拉丁字符作为键是 100% 有效的 - 因为 any 字符串可以用作键。 JavaScript 中 unicode 字符串的任何问题(在实现中,其中有几个:只是没有影响此代码)是次要考虑因素,不会改变 ECMAScript 的定义。如果有人认为这样的“无效”,那么这是个人意见。 @venimus 见"6.1.7 .. Properties are identified using key values. A property key value is either an ECMAScript String value or a Symbol value. All String and Symbol values, including the empty string, are valid as property keys. A property name is a property key that is a String value.",这个话题很清楚了。以上是关于带有非拉丁字符的 Javascript slug 函数的主要内容,如果未能解决你的问题,请参考以下文章
姜戈。非 ascii 字段不会创建 slug。我希望得到音译,但得到一个空字段和错误