2010-05-03 122 views
2

這是我的代碼:非轉義的 '^' 與JSLint的

 

/********************************************************** 
* remove non-standard characters to give a valid html id * 
**********************************************************/ 
function htmlid(s) { 
return s.gsub(/[^A-Z^a-z^0-9^\-^_^:^\.]/, "."); 
} 

爲什麼JSLint的拋出這個錯誤?

 
Lint at line 5 character 25: Unescaped '^'. 
return s.gsub(/[^A-Z^a-z^0-9^\-^_^:^\.]/, "."); 
+0

我喜歡'^ _ ^'!^_ ^(我想知道是否真的有必要使用'gsub()'函數作爲'replace()'的別名......) – Tomalak 2010-05-03 16:38:09

回答

2

如果你打算有一個否定的字符類,那麼這就是你想要的東西:

return s.gsub(/[^A-Za-z0-9_:.-]/, "."); 
+1

您必須轉義點:s.gsub(/ [^ A-Za- z0-9 -_:\。] /,「。」); – Vincent 2010-05-03 16:41:00

+5

@Vincent。不,你沒有,這個點在角色類中沒有特別的意義。但是你必須逃避衝刺,或者把它放在最後。 – Tomalak 2010-05-03 16:48:53

+0

@Tomalak Ouch,不知道。 +1 – Vincent 2010-05-03 18:51:57

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; 
} 
+0

+1。我添加了一個可以擺脫arguments.callee的答案。如果您想將其作爲替代溶劑複製到您的答案中,請這樣做,我將刪除我的答案。 – 2010-05-03 17:17:53

5

如果你喜歡這個(它是一樣的,但他沒有使用arguments.callee的加緩存的正則表達式本身)不要投票支持這一...投票託默勒格的答案。

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; 
    }; 
}()); 
+2

+1用於優化我的版本與封閉:-)我不想讓它變得比必要更復雜,因爲我已經偏離了原來的問題,但這當然更有效。 – Tomalak 2010-05-03 17:19:27

+0

你應該得到這個信用:) – 2010-05-03 17:32:14

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" 

Howvere,我通過你的功能:

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; 
    }; 
}());