EDIT : Cette réponse a été ajoutée à l'origine il y a 9 ans. Aujourd'hui, vous devez utiliser localeCompare
l' sensitivity: 'accent'
option:
function ciEquals(a, b) {
return typeof a === 'string' && typeof b === 'string'
? a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0
: a === b;
}
console.log("'a' = 'a'?", ciEquals('a', 'a'));
console.log("'AaA' = 'aAa'?", ciEquals('AaA', 'aAa'));
console.log("'a' = 'á'?", ciEquals('a', 'á'));
console.log("'a' = 'b'?", ciEquals('a', 'b'));
Le { sensitivity: 'accent' }
dit localeCompare()
de traiter deux variantes de la même lettre de base comme identiques, sauf si elles ont des accents différents (comme dans le troisième exemple) ci-dessus.
Alternativement, vous pouvez utiliser { sensitivity: 'base' }
, qui traite deux caractères comme équivalents tant que leur caractère de base est le même (il A
serait donc traité comme équivalent à á
).
Remarque que le troisième paramètre de localeCompare
n'est pas pris en charge dans IE10 ou inférieur ou dans certains navigateurs mobiles (voir le tableau de compatibilité sur la page liée ci-dessus), donc si vous devez prendre en charge ces navigateurs, vous aurez besoin d'une sorte de solution de rechange:
function ciEqualsInner(a, b) {
return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
}
function ciEquals(a, b) {
if (typeof a !== 'string' || typeof b !== 'string') {
return a === b;
}
// v--- feature detection
return ciEqualsInner('A', 'a')
? ciEqualsInner(a, b)
: /* fallback approach here */;
}
Réponse originale
La meilleure façon de faire une comparaison insensible à la casse en JavaScript est d'utiliser RegExp match()
méthode avec l' i
indicateur.
Recherche insensible à la casse
Lorsque les deux chaînes comparées sont des variables (pas des constantes), c'est un peu plus compliqué, car vous devez générer un RegExp à partir de la chaîne, mais le passage de la chaîne au constructeur RegExp peut entraîner des correspondances incorrectes ou des correspondances échouées si la chaîne a une expression rationnelle spéciale personnages en elle.
Si vous vous souciez de l'internationalisation, n'utilisez pas toLowerCase()
ou toUpperCase()
car il ne fournit pas de comparaisons précises insensibles à la casse dans toutes les langues.
http://www.i18nguy.com/unicode/turkish-i18n.html
.localeCompare()
méthode javascript nouvellement ajoutée . Uniquement pris en charge par les navigateurs modernes au moment de l'écriture (IE11 +). voir developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…