Come posso eseguire un confronto di stringhe insensibile alle maiuscole e alle minuscole in JavaScript?
EDIT: Questa risposta è stata originariamente aggiunta 9 anni fa. Oggi dovresti usare localeCompare
con l'opzione sensibilità: 'accento'
:
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'));
La { sensibilità: 'accento' }
dice a localeCompare()
di trattare due varianti della stessa lettera base come la stessa a meno che abbiano accenti diversi (come nel terzo esempio) sopra.
In alternativa, puoi usare { sensitivity: 'base' }
, che tratta due caratteri come equivalenti finché il loro carattere di base è lo stesso (quindi A
sarebbe trattato come equivalente a á
).
Nota che il terzo parametro di localeCompare
non è supportato in IE10 o inferiore o in certi browser mobili (vedi la tabella di compatibilità nella pagina linkata sopra), quindi se hai bisogno di supportare quei browser, avrai bisogno di qualche tipo di 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 */;
}
Risposta originale
Il modo migliore per fare un confronto case insensitive in JavaScript è usare il metodo RegExp match()
con il flag i
.
https://stackoverflow.com/questions/177719/javascript-case-insensitive-search
Quando entrambe le stringhe confrontate sono variabili (non costanti), allora è un po' più complicato 'perché è necessario generare una RegExp dalla stringa, ma passare la stringa al costruttore RegExp può risultare in corrispondenze errate o fallite se la stringa contiene caratteri speciali regex.
Se vi interessa l'internazionalizzazione non usate toLowerCase()
o toUpperCase()
in quanto non fornisce confronti case-insensitive accurati in tutte le lingue.