【问题标题】:Javascript slug function with non-latin chars带有非拉丁字符的 Javascript slug 函数
【发布时间】: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);
  }

【问题讨论】:

    标签: javascript regex slug


    【解决方案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)

    【讨论】:

    猜你喜欢
    • 2019-07-11
    • 1970-01-01
    • 2019-07-02
    • 2015-06-26
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多