2009-08-07 6 views
13

J'essaie de trouver si une image a dans son nom de source noPic qui peut être en majuscule ou en minuscule.JavaScript indexOf à ignorer Cas

var noPic = largeSrc.indexOf("nopic"); 

devrais-je écrire:

var noPic = largeSrc.toLowerCase().indexOf("nopic"); 

Mais cette solution ne fonctionne pas ...

+0

Qu'est-ce que largeSrc? Êtes-vous sûr que c'est une chaîne? –

+0

Utilisez le débogueur. Définissez un point d'arrêt sur la ligne 'var noPic = ...' et voyez le type et la valeur de 'largeSrc'. Ou vous pouvez mettre un 'console.log (typeof largeSrc, largeSrc);' avant votre ligne. Mais à partir de la question, il semble que vous ne soyez pas familier avec le débogueur JavaScript interactif dans votre navigateur. Je recommande fortement de s'y familiariser. Par exemple: [Didacticiel Chrome DevTools] (https://developer.chrome.com/devtools). –

Répondre

21

Vous pouvez utiliser regex avec un modificateur insensible à la casse - certes pas forcément aussi vite que indexOf.

var noPic = largeSrc.search(/nopic/i); 
+6

Selon: http://jsperf.com/regex-vs-tolowercase-then-regex/2 la méthode regex est plus rapide que toLower() –

+1

la méthode regex finit par être plus lente si le terme de recherche provient de l'entrée de l'utilisateur, voir ma réponse ici http://stackoverflow.com/a/19920595/1333402 – ssmith

+1

Oui, parce que la différence de 50 ms est va vraiment me faire chier ... – ppumkin

14

Non, il n'y a aucun moyen insensible à la casse d'appeler cette fonction. La raison pour laquelle votre deuxième exemple ne fonctionne peut-être pas parce que vous manquez un appel à la fonction text().

Essayez ceci:

var search = "nopic"; 
var noPic = largeSrc.text().toLowerCase().indexOf(search.toLowerCase()); 
+0

note que indexOf() peut être lent pour les grandes chaînes, voir http://stackoverflow.com/a/4579228/1333402 – ssmith

2

Notez que si la chaîne de recherche est de l'entrée d'utilisateur que vous devrez échapper aux caractères regexp spéciaux, qui à la fin ralentit l'approche regexp, ce qui rend la toLowerCase() approche le plus rapide dans ce cas.

est ici ce qu'il ressemblerait à ceci:

var search = getUserInput(); 

/* this slows it down */ 
var regex = RegExp(search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), "i"); 

var noPic = testString.search(regex); 

Voir la jsperf mise à jour: http://jsperf.com/regex-vs-tolowercase-then-regex/4

note: regexp échapper https://stackoverflow.com/a/3561711/1333402

2

Essayez avec:

var lowerCaseLargeSrc = largeSrc.toLowerCase(); 
var noPic = lowerCaseLargeSrc.indexOf("nopic"); 
0

Votre code ne fonctionnera que si largeSrc est déjà une chaîne. Vous pourriez obtenir une entrée qui est un élément html à la place. Ainsi, utilisez jQuery pour résoudre tout élément d'entrée potentiel dans le texte qui s'y trouve. Exemple:

var noPic = largeSrc.text().toLowerCase().indexOf("nopic"); 
Questions connexes