带有非拉丁字符的 Javascript slug 函数

标签 javascript regex slug

我正在编写一个函数来根据输入生成 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);
  }

最佳答案

filename 未更改 - 变量命名相同的字符串,并且该字符串无法修改。因此,当每个循环使用 filename.replace.. 时,它会再次开始处理原始字符串。

相反,消除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)

关于带有非拉丁字符的 Javascript slug 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20981537/

相关文章:

javascript - Azure Function 执行速度极慢且不一致

JavaScript 正则表达式如果出现次数超过 n 则替换

php - 连接两个表并获取最新的 slug

javascript - 如何在不使用 document.writes 的情况下在 document.getelementById 函数中编写 for 循环

javascript - 如何使用 "controller as"语法引用命名表单

javascript - 选中单选按钮时尝试使用 javascript 添加唯一类

regex - 查找字符串中的每个非唯一字符

javascript - 用 JavaScript/jQuery 替换 dom 对象中字符串的各种出现的最快、最可靠的方法

php - 为什么在使用\b 字边界时使用 = 或 "break PHP regex 等特殊字符?

WordPress slug 重复内容父/子