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

763

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

$(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();
        }
    });
});

Что не работает.

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

Я ценю любую помощь.

  • 12
    Измените ваш селектор с $('select[id="Engraving"]') на $('#Engraving') . Это будет быстрее. А внутри обработчика change this относится к элементу #Engraving , так что вы можете сделать $(this).find('option:selected') .
  • 0
    Как насчет: содержит селектор?
Показать ещё 1 комментарий
Теги:
string
contains

13 ответов

1727
Лучший ответ

Вот так:

if (str.indexOf("Yes") >= 0)

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

if (~str.indexOf("Yes"))

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

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

if (str.toLowerCase().indexOf("yes") >= 0)

Или

if (/yes/i.test(str))
  • 23
    Может кто-нибудь объяснить, if (/yes/i.test(str)) ?
  • 48
    @DrewS: это регулярное выражение.
Показать ещё 12 комментариев
100

Вы можете использовать search или match для этого.

str.search( 'Yes' )

вернет позицию совпадения или -1, если он не найден.

  • 24
    Полезно знать альтернативы, но использование indexOf быстрее. stackoverflow.com/questions/354110/...
  • 4
    да, но также не поддерживается в IE
Показать ещё 8 комментариев
21

Другой способ:

var testStr = "This is a test";

if(testStr.contains("test")){
    alert("String Found");
}

** Проверено на Firefox, Safari 6 и Chrome 36 **

  • 3
    Какой браузер вы используете? "TypeError: Object Это тест не имеет метода" содержит "" <~ Chrome 25
  • 2
    yoshi, похоже, это доступно только в FireFox ... извините за путаницу, был перед FF, не думал тестировать в других браузерах ...
Показать ещё 2 комментария
18

Это довольно поздно, чтобы написать этот ответ, но я подумал о том, чтобы включить его в любом случае. String.prototype теперь имеет метод includes, который может проверять подстроку. Этот метод чувствителен к регистру.

var str = 'It was a good date';
console.log(str.includes('good')); // shows true
console.log(str.includes('Good')); // shows false

Чтобы проверить подстроку, можно сделать следующий подход:

if (mainString.toLowerCase().includes(substringToCheck.toLowerCase())) {
    // mainString contains substringToCheck
}

Ознакомьтесь с документацией, чтобы узнать больше.

  • 1
    В случае, если это касается вас, этот метод в настоящее время не поддерживается ни в одной версии IE или Opera.
  • 0
    @srussking Тем не менее он поддерживается в современных версиях Firefox и Chrome на момент написания статьи (для чего это стоит)
7

Вы можете использовать этот Polyfill в ie и chrome

if (!('contains' in String.prototype)) {
    String.prototype.contains = function (str, startIndex) {
        "use strict";
        return -1 !== String.prototype.indexOf.call(this, str, startIndex);
    };
}
  • 0
    В названии сказано, что это должно быть сделано в jQuery. Зачем идти к такому расширению и усложнять вещи с нечитаемым кодом, если вы можете сделать это с помощью простого if в jQuery?
  • 4
    это на мой взгляд хорошее решение. дает метод .contains, который делает то, о чем просили. конечно, на это не приятно смотреть, но это отличная утилита ... также "если" не имеет ничего общего с jQuery ... все остальные ответы были реализациями js ...
5

В ECMAScript 6 представлен String.prototype.includes, ранее названный contains.

Его можно использовать следующим образом:

'foobar'.includes('foo'); // true
'foobar'.includes('baz'); // false

Он также принимает необязательный второй аргумент, который указывает позицию начала поиска:

'foobar'.includes('foo', 1); // false
'foobar'.includes('bar', 1); // true

Это может быть polyfilled, чтобы он работал в старых браузерах.

  • 0
    Это, в отличие от намека Мунима Дибоша, указывающего на чувствительность к регистру, полифилд делает действительно стабильную работу, в том числе и для старых браузеров.
4

Возвращает количество раз, когда ключевое слово включено в строку.

var count = "I have one keyword".match(/keyword/g);
var clean_count = !count ? false : count.length;
  • 0
    match может вернуть null , и таким образом заставить ваш код бросить
  • 0
    match возвращает массивы. Массив не может быть нулевым. Это может быть пустым. Вот почему я добавил «длина». длина пустого массива равна false. @Oriol
Показать ещё 2 комментария
2

Я знаю, что лучший способ - str.indexOf(s) !== -1; http://hayageek.com/javascript-string-contains/

Я предлагаю другой способ (str.replace(s1, "") !== str):

var str = "Hello World!", s1 = "ello", s2 = "elloo";
alert(str.replace(s1, "") !== str);
alert(str.replace(s2, "") !== str);
1

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

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

searchString: - Строка, которую нужно искать внутри этой строки.

позиция: -Дополнительный. Позиция в этой строке, в которой следует искать searchString; по умолчанию - 0.

string = 'LOL';
console.log(string.includes('lol')); // returns false 
console.log(string.includes('LOL')); // returns true 
  • 0
    Это не имеет большой поддержки браузера: caniuse.com/#feat=es6-string-include в настоящее время 90% в примечании США: не поддерживается в IE <= 11
1

Если вы способны использовать библиотеки, вы можете обнаружить, что библиотека Lo-Dash очень полезна. В этом случае идите и проверьте _.contains() (заменяется на _.includes() как на v4).

(Примечание. Соглашение Lo-Dash называет библиотечный объект _. Не забудьте проверить установку на той же странице, чтобы настроить его для своего проекта.)

_.contains("foo", "oo");     // → true
_.contains("foo", "bar");    // → false
// Equivalent with:
_("foo").contains("oo");     // → true
_("foo").contains("bar");    // → false

В вашем случае, продолжайте и используйте:

_.contains(str, "Yes");
// or:
_(str).contains("Yes");

.. какой вам лучше.

  • 1
    Примечание для читателей, которые гуглили и приземлялись здесь, как я: _.contains() заменяется на _.includes() с версии 4.;)
1

Вы также можете проверить, содержится ли точное слово в строке. Например:.

function containsWord(haystack, needle) {
    return (" " + haystack + " ").indexOf(" " + needle + " ") !== -1;
}

Использование:

containsWord("red green blue", "red"); // true
containsWord("red green blue", "green"); // true
containsWord("red green blue", "blue"); // true
containsWord("red green blue", "yellow"); // false

Вот как jQuery выполняет свой метод hasClass.

0

Ни один из вышеперечисленных не работал у меня, поскольку были пробелы, но это то, что я сделал

tr = table.getElementsByTagName("tr");

    for (i = 0; i < tr.length; i++) {
        td = tr[i].getElementsByTagName("td")[0];
        bottab.style.display="none";
        bottab2.style.display="none";
        if (td) {
        var getvar=td.outerText.replace(/\s+/, "") ;

            if (getvar==filter){
                tr[i].style.display = "";
            }else{
                tr[i].style.display = "none";
            }

        }
    }
-2

вы можете определить метод расширения и использовать его позже.

String.prototype.contains = function(it) 
{ 
   return this.indexOf(it) != -1; 
};

чтобы вы могли использовать его на своей странице в любом месте:

var str="hello how are you";
str.contains("are");

который возвращает true.

Обратитесь к сообщению ниже за дополнительными вспомогательными методами. Методы поддержки Javascript

Ещё вопросы

Сообщество Overcoder
Наверх
Меню