EDIT : Cette réponse a été ajoutée à l'origine il y a 9 ans. Aujourd'hui, vous devez utiliser localeComparel' 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 Aserait donc traité comme équivalent à á).
Remarque que le troisième paramètre de localeComparen'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' iindicateur.
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/…