2010-05-03 6 views
2

Voici mon code:sans échappement '^' avec JSLint

 

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

Pourquoi ne JSLint jeter cette erreur?

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

J'aime le '^ _ ^'!^_^(Et je me demande si une fonction 'gsub()' qui n'est en fait qu'un alias pour 'replace()' est vraiment nécessaire ...) – Tomalak

Répondre

2

Si ce que vous avez l'intention d'avoir une classe de caractères niée, alors c'est ce que vous voulez:

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

Vous devez échapper le point: s.gsub (/ [^ A-Za- z0-9 -_: \.] /, "."); – Vincent

+5

@Vincent. Non, vous n'avez pas, le point n'a pas de signification particulière dans une classe de caractères. Mais vous devez échapper au tableau de bord, ou le mettre à la fin. – Tomalak

+0

@Tomalak Ouch, ne le savais pas. +1 – Vincent

5

Outre le changement évident pour l'expression rationnelle, je vous recommande la modification suivante à la fonction lui-même:

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. J'ai ajouté une réponse qui se débarrasse des arguments.callee. Si vous voulez le copier dans votre réponse en tant que solution de rechange, veuillez le faire et je supprimerai ma réponse. –

5

ne votez pas pour cette ... vote pour la réponse de Tomalak si vous aimez ce (il est le même que la sienne, mais sans utiliser la mise en cache arguments.callee, plus le regex lui-même).

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 pour l'optimisation de ma version avec une fermeture :-) Je ne voulais pas le rendre plus compliqué que nécessaire puisque j'étais déjà en train de diverger de la question originale, mais ceci est bien sûr plus efficace. – Tomalak

+0

Vous méritez des crédits pour cela aussi :) –

1

Tout d'abord, merci pour les réponses. Vous avez apporté une petite erreur à la sémantique de la fonction, car elle devrait renvoyer le même identifiant si je demande deux fois la même chaîne. .: par exemple

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, j'ai adopté vos fonctions:

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