2

这是我的代码:

/************************************************* *********
 * 删除非标准字符以提供有效的 html id *
 ****************************************************** ********/
函数 htmlid(s) {
 返回 s.gsub(/[^AZ^az^0-9^\-^_^:^\.]/, ".");
}

为什么jslint会抛出这个错误?

第 5 行字符 25 处的 Lint:未转义的 '^'。
返回 s.gsub(/[^AZ^az^0-9^\-^_^:^\.]/, ".");
4

4 回答 4

5

Don't vote for this...vote for Tomalak's answer if you like this (it is the same as his but without using arguments.callee plus caching the regex itself).

var htmlid = (function(){
    var cache = {},
        reg = /[^A-Za-z0-9_:.-]/;
    return function(s){
        var id = s.replace(reg, ".");
        if (id in cache){ id += cache[id]++;}
        cache[id] = 0;

        return id;
    };
}());
于 2010-05-03T17:13:35.887 回答
5

除了对正则表达式的明显更改之外,我建议对函数本身进行以下更改:

function htmlid(s) {
  // prevents duplicate IDs by remembering all IDs created (+ a counter)
  var self = arguments.callee;
  if (!self.cache) self.cache = {};

  var id = s.replace(/[^A-Za-z0-9_:.-]/, "."); // note the dash is at the end!
  if (id in self.cache) id += self.cache[id]++;
  self.cache[id] = 0;

  return id;
}
于 2010-05-03T16:47:59.803 回答
2

如果您打算拥有的是否定字符类,那么这就是您想要的:

return s.gsub(/[^A-Za-z0-9_:.-]/, ".");
于 2010-05-03T16:37:02.207 回答
1

首先,感谢您的回答。您给函数的语义带来了一点错误,因为如果我两次查询相同的字符串,它应该返回相同的 id。例如:

htmlid("foo bar");  // -> "foo.bar"
htmlid("foo bar");  // -> "foo.bar"
htmlid("foo.bar");  // -> "foo.bar0"
htmlid("foo.bar0"); // -> "foo.bar00"
htmlid("foo.bar");  // -> "foo.bar0"

但是,我采用了您的功能:

var htmlid = (function () {
    var cache = {},
        ncache = {},
        reg = /[^A-Za-z0-9_:.-]/;
    return function (s) {
        var id;
        if (s in cache) {
            id = cache[s];
        } else {
            id = s.replace(reg,".");
            if (id in ncache) {
                id += ncache[id]++;
            }
            ncache[id] = 0;
            cache[s] = id;
        }
        return id;
    };
}());
于 2010-05-05T13:29:00.093 回答