РЕДАКТИРОВАТЬ : Этот ответ был первоначально добавлен 9 лет назад. Сегодня вы должны использовать localeCompare
с опцией sensitivity: 'accent'
:
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'));
{ sensitivity: 'accent' }
говорит localeCompare()
обрабатывать два варианта одной и той же базовой буквы как один и тот же , если только они не имеют разные акценты (как в третьем примере) выше.
Кроме того, вы можете использовать { sensitivity: 'base' }
, который обрабатывает два символа как эквивалентные, если их базовый символ одинаков (поэтому A
будет рассматриваться как эквивалентный á
).
Обратите внимание , что третий параметр localeCompare
не поддерживается в IE10 или более ранних версиях или в некоторых мобильных браузерах (см. Таблицу совместимости на странице, указанной выше), поэтому если вам необходимо поддерживать эти браузеры, вам понадобится некоторый запасной вариант:
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 */;
}
Оригинальный ответ
Лучший способ сделать сравнение без учета регистра в JavaScript - это использовать метод RegExp match()
с флагом i
.
Поиск без учета регистра
Когда обе сравниваемые строки являются переменными (не константами), тогда это немного сложнее, потому что вам нужно сгенерировать RegExp из строки, но передача строки в конструктор RegExp может привести к неправильным совпадениям или неудачным совпадениям, если строка содержит специальные символы регулярных выражений.
Если вы заботитесь о интернационализации, не используйте toLowerCase()
или toUpperCase()
, поскольку она не обеспечивает точного сравнения без учета регистра на всех языках.
http://www.i18nguy.com/unicode/turkish-i18n.html