JavaScript indexOf, чтобы игнорировать Case

Я пытаюсь найти, если изображение имеет в своем исходном названии noPic, которое может быть в верхнем или нижнем регистре.

var noPic = largeSrc.indexOf("nopic");

Должен ли я писать:

var noPic = largeSrc.toLowerCase().indexOf("nopic");

Но это решение не работает...

Ответы

Ответ 1

Вы можете использовать регулярное выражение с модификатором без учета регистра - по общему признанию, не обязательно так быстро, как indexOf.

var noPic = largeSrc.search(/nopic/i);

Ответ 2

Нет, для вызова этой функции нет способа, нечувствительного к регистру. Возможно, причина, по которой ваш второй пример не работает, заключается в том, что вам не хватает вызова функции text().

Попробуйте следующее:

var search = "nopic";
var noPic = largeSrc.text().toLowerCase().indexOf(search.toLowerCase());

Ответ 3

Обратите внимание, что если строка поиска находится от пользовательского ввода, вам нужно будет избежать специальных символов регулярного выражения, что в конечном итоге замедляет подход regexp, что делает подход toLowerCase() самым быстрым в этом случае.

Вот как это выглядит:

var search = getUserInput();

/* this slows it down */
var regex = RegExp(search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), "i");

var noPic = testString.search(regex);

См. обновленный jsperf: http://jsperf.com/regex-vs-tolowercase-then-regex/4

footnote: regexp escaping из fooobar.com/questions/2655/...

Ответ 4

Попробуйте:

var lowerCaseLargeSrc = largeSrc.toLowerCase();
var noPic = lowerCaseLargeSrc.indexOf("nopic");

Ответ 5

Ваш код будет работать, только если largeSrc уже является строкой. Вместо этого вы можете получить входной элемент html. Итак, используйте jQuery для разрешения любого потенциального элемента ввода в текст, который внутри него. Пример:

var noPic = largeSrc.text().toLowerCase().indexOf("nopic");