EDIT : Esta resposta foi originalmente adicionada há 9 anos. Hoje você deve usar localeCompare
com a sensitivity: 'accent'
opção:
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'));
O { sensitivity: 'accent' }
comando diz localeCompare()
para tratar duas variantes da mesma letra base da mesma, a menos que tenham sotaques diferentes (como no terceiro exemplo) acima.
Como alternativa, você pode usar { sensitivity: 'base' }
, que trata dois caracteres como equivalente, desde que o caractere base seja o mesmo (portanto, A
seria tratado como equivalente a á
).
Observe que o terceiro parâmetro de localeCompare
não é suportado no IE10 ou em navegadores móveis inferiores ou em certos dispositivos (consulte a tabela de compatibilidade na página acima), portanto, se você precisar oferecer suporte a esses navegadores, precisará de algum tipo de fallback:
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 */;
}
Resposta original
A melhor maneira de fazer uma comparação sem distinção entre maiúsculas e minúsculas no JavaScript é usar o match()
método RegExp com o i
sinalizador.
Pesquisa que não diferencia maiúsculas de minúsculas
Quando as duas strings comparadas são variáveis (não constantes), é um pouco mais complicado, porque você precisa gerar um RegExp a partir da string, mas passar a string para o construtor RegExp pode resultar em correspondências incorretas ou falhas na correspondência, se a string possuir regex especial caracteres nele.
Se você se preocupa com a internacionalização, não use toLowerCase()
ou toUpperCase()
não forneça comparações precisas que não diferenciam maiúsculas de minúsculas em todos os idiomas.
http://www.i18nguy.com/unicode/turkish-i18n.html
.localeCompare()
método javascript recém-adicionado . Suportado apenas por navegadores modernos no momento da gravação (IE11 +). consulte developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…