11

Как проверить, содержит ли строка подстроку?

12

Описание проблемы:

У меня есть корзина покупок, в которой товары отображаются в выпадающем меню. Если пользователь выбирает "да", то я хочу сделать некоторые другие поля на странице видимыми.

Проблема в том, что текст выбора в корзине также включает модификатор цены, который может варьироваться для каждого товара. У меня есть следующий работающий код:

$(document).ready(function() {
    $('select[id="Engraving"]').change(function() {
        var str = $('select[id="Engraving"] option:selected').text();
        if (str == "Yes (+ $6.95)") {
            $('.engraving').show();
        } else {
            $('.engraving').hide();
        }
    });
});

Однако я бы хотел использовать что-то вроде этого, но это не работает:

$(document).ready(function() {
    $('select[id="Engraving"]').change(function() {
        var str = $('select[id="Engraving"] option:selected').text();
        if (str *= "Yes") {
            $('.engraving').show();
        } else {
            $('.engraving').hide();
        }
    });
});

Я хочу выполнить действие только в том случае, если выбранный вариант содержит слово "Yes", игнорируя модификатор цены. Как мне это сделать?

5 ответ(ов)

23

Чтобы проверить, содержится ли подстрока "Да" в строке, вы можете использовать метод indexOf():

if (str.indexOf("Да") >= 0)

...или вы можете использовать оператор тильда:

if (~str.indexOf("Да"))

Это работает потому, что метод indexOf() возвращает -1, если подстрока не была найдена.

Обратите внимание, что этот метод чувствителен к регистру.

Если вы хотите выполнить поиск без учета регистра, вы можете написать:

if (str.toLowerCase().indexOf("да") >= 0)

Или:

if (/да/i.test(str))

Последний вариант использует регулярное выражение или regex.

Разбор регулярного выражения:

  • / указывает на то, что это регулярное выражение
  • да означает, что regex будет искать эти точные символы в этом точном порядке
  • / завершает регулярное выражение
  • i устанавливает регулярное выражение как нечувствительное к регистру
  • .test(str) определяет, соответствует ли регулярное выражение переменной str

В итоге это означает, что проверка будет искать буквы д, а в указанном порядке, без учета регистра, в переменной str.

0

Метод includes() определяет, содержится ли одна строка в другой строке, возвращая true или false в зависимости от результата проверки.

Синтаксис: string.includes(searchString[, position])

  • searchString: Строка, которую необходимо найти в данной строке.
  • position: Необязательный параметр. Позиция в данной строке, с которой начнется поиск searchString; по умолчанию равна 0.
string = 'LOL';
console.log(string.includes('lol')); // возвращает false 
console.log(string.includes('LOL')); // возвращает true 

Обратите внимание, что метод includes() учитывает регистр букв, поэтому строка 'lol' не найдена в строке 'LOL', так как регистры различаются.

0

Вы можете использовать этот полифилл для поддержки метода contains в IE и Chrome:

if (!('contains' in String.prototype)) {
    String.prototype.contains = function (str, startIndex) {
        "use strict";
        return -1 !== String.prototype.indexOf.call(this, str, startIndex);
    };
}

Этот код проверяет, существует ли метод contains в прототипе String. Если его нет, он добавляет этот метод, который позволяет проверять, содержится ли указанная подстрока в строке, начиная с заданного индекса. Использование String.prototype.indexOf помогает реализовать данную функциональность.

0

Да, вы правы, что лучший способ проверить, содержится ли подстрока в строке, — это использовать str.indexOf(s) !== -1. Однако вы также можете использовать другой подход, основанный на методе replace, как вы и предложили.

Ваш пример кода выглядит следующим образом:

var str = "Hello World!", s1 = "ello", s2 = "elloo";
alert(str.replace(s1, "") !== str); // Это будет true, так как "ello" есть в строке
alert(str.replace(s2, "") !== str); // Это будет false, так как "elloo" отсутствует

Этот способ работает, поскольку метод replace возвращает новую строку с заменённой подстрокой. Если подстрока s1 присутствует в str, результат замены будет отличаться от оригинала. В противном случае, если подстрока не найдена (как в случае с s2), строка останется неизменной, и сравнение вернёт false.

Тем не менее, стоит отметить, что данный способ менее читаем и производителен по сравнению с indexOf. В большинстве случаев str.indexOf(s) !== -1 будет предпочтительнее, особенно для больших строк, так как он более прямолинеен и не создаёт новых строк в процессе.

0

Вот один из способов, как проверить наличие подстроки в строке на JavaScript:

var testStr = "This is a test";

if (testStr.includes("test")) {
    alert("Строка найдена");
}

Метод includes() проверяет, содержит ли строка указанную подстроку, и возвращает true или false. В данном случае, если присутствует "test", будет вызвано окно с сообщением "Строка найдена".

Тестировано в Firefox, Safari 6 и Chrome 36.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь