2010-02-26 2 views
9

Pourquoi est-ce que JSLint renvoie un 'Bad échappement' sur la ligne JavaScript suivante?Pourquoi JSLint renvoie-t-il un 'mauvais échappement' sur cette ligne de code?

param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 

De la documentation JSLint je pensais que ce serait ok car le littéral regex est précédée par une parenthèse:

Les expressions régulières sont écrites dans un laconique et notation cryptique. JSLint recherche les problèmes susceptibles de provoquer des problèmes de portabilité . Il tente également de résoudre les ambiguïtés visuelles en recommandant échappement explicite.

La syntaxe de JavaScript pour les littéraux d'expression normaux surcharge le caractère/ . Pour éviter toute ambiguïté, JSLint attend à ce que le caractère précédant une expression régulière littérale est un (ou = ou: ou, caractère

+2

Pourquoi utilisez-vous des classes de caractères pour des caractères uniques? –

+0

Etes-vous sûr que "Mauvais échappement" fait référence au caractère précédant une expression régulière? Le message d'erreur et votre description ne semblent pas correspondre. – Joey

+0

@Johannes: Il ne se réfère pas aux expressions régulières, mais je peux voir comment on pourrait penser cela. C'est la seule section dans les instructions où "échappement" est mentionné. – Guffa

Répondre

13

Ce n'est pas l'expression régulière qu'il se plaint de vous échappez des caractères dans la.. chaînes de remplacement qui n'a pas besoin du tout échapper

les caractères [et] ont pas de signification particulière dans une chaîne ordinaire, vous ne devez pas leur échapper.

param = param.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]"); 

note: Comme Anon a souligné, vous n'avez pas besoin d'utiliser un jeu de caractères pour un seul caractère:

param = param.replace(/\[/,"\\[").replace(/\]/,"\\]"); 

Vous pouvez également correspondre les deux personnages dans une seule expression régulière, attrapez ce que vous correspondez et utilisez le remplacement. Si vous souhaitez remplacer plus que la première occurrence, vous souhaitez utiliser l'option globale:

param = param.replace(/(\[|\])/g,"\\$1"); 
+0

Thx Guffa. J'étais sur le point de mettre à jour car après avoir joué avec un peu plus, j'ai compris que j'avais une fuite supplémentaire là-bas. Mes compétences en regex sont terribles, cela fait partie d'une fonction 'querystring' que j'ai trouvé sur un site web pour récupérer des paramètres de l'URL, donc je ne l'avais pas beaucoup questionné car ça fonctionnait. Je vois que votre version d'une ligne est bien meilleure, merci! – SBUJOLD

Questions connexes