带有非拉丁字符的 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。我希望得到音译,但得到一个空字段和错误

如何使用 Node 从 MySQL 读取非拉丁字符?

如何从非英语值创建一个 slug?

带有多字节 UTF-8 文件名的 PHP basename() 和 pathinfo()

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

xml 输出中的非拉丁字符