EDIT : questa risposta è stata originariamente aggiunta 9 anni fa. Oggi dovresti usare localeCompare
con l' sensitivity: 'accent'
opzione:
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 { sensitivity: 'accent' }
dice localeCompare()
per trattare due varianti della stessa lettera di base come lo stesso meno hanno accenti diversi (come nel terzo esempio) di cui sopra.
In alternativa, puoi usare { sensitivity: 'base' }
, che tratta due personaggi equivalenti purché il loro personaggio base sia lo stesso (quindi A
verrebbe trattato come equivalente a á
).
Si noti che il terzo parametro di localeCompare
non è supportato in IE10 o browser browser inferiori o determinati (vedere la tabella di compatibilità nella pagina collegata sopra), quindi se è necessario supportare tali browser, è necessario un 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 eseguire un confronto senza distinzione tra maiuscole e minuscole in JavaScript è utilizzare il match()
metodo RegExp con il i
flag.
Ricerca senza distinzione tra maiuscole e minuscole
Quando entrambe le stringhe confrontate sono variabili (non costanti), è un po 'più complicato perché è necessario generare un RegExp dalla stringa ma passare la stringa al costruttore RegExp può provocare corrispondenze errate o corrispondenze non riuscite se la stringa ha regex speciale personaggi in esso.
Se ti interessa l'internazionalizzazione non utilizzare toLowerCase()
o toUpperCase()
in quanto non fornisce confronti accurati senza distinzione tra maiuscole e minuscole in tutte le lingue.
http://www.i18nguy.com/unicode/turkish-i18n.html
.localeCompare()
metodo javascript appena aggiunto . Supportato solo dai browser moderni al momento della scrittura (IE11 +). vedi developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…