Як виконати порівняння рядків без врахування регістру в JavaScript?
**РЕДАГУВАТИ]: Ця відповідь була додана 9 років тому. Сьогодні вам слід використовувати localeCompare
з опцією чутливість: 'наголос'
:
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'));
Параметр { чутливість: 'наголос' }
вказує 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
.
https://stackoverflow.com/questions/177719/javascript-case-insensitive-search
Якщо обидва порівнювані рядки є змінними (а не константами), то все трохи складніше, оскільки потрібно згенерувати RegExp з рядка, але передача рядка в конструктор RegExp може призвести до некоректних збігів або невдалих збігів, якщо в рядку присутні спеціальні regex-символи.
Якщо ви дбаєте про інтернаціоналізацію, не використовуйте toLowerCase()
або toUpperCase()
, оскільки вони не забезпечують точне порівняння без урахування регістру у всіх мовах.
Я написав продовження. Дуже тривіальне.
if (typeof String.prototype.isEqual!= 'function') {
String.prototype.isEqual = function (str){
return this.toUpperCase()==str.toUpperCase();
};
}