web-dev-qa-db-fra.com

Comment vérifier si la chaîne contient une sous-chaîne?

J'ai un panier d'achat qui affiche les options de produit dans un menu déroulant. S'ils sélectionnent "oui", je souhaite rendre visibles d'autres champs de la page.

Le problème est que le panier inclut également le modificateur de prix dans le texte, qui peut être différent pour chaque produit. Le code suivant fonctionne:

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

Cependant, je préférerais utiliser quelque chose comme ceci, qui ne fonctionne pas:

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

Je souhaite uniquement exécuter l'action si l'option sélectionnée contient le mot "Oui" et ignorer le modificateur de prix.

947
Jordan Garis

Comme ça:

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

... ou vous pouvez utiliser l'opérateur tilde:

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

Cela fonctionne parce que indexOf() renvoie -1 si la chaîne n'a pas été trouvée.

Notez que ceci est sensible à la casse.
Si vous voulez une recherche ne respectant pas la casse, vous pouvez écrire

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

Ou,

if (/yes/i.test(str))
2045
SLaks

Vous pouvez utiliser recherche ou correspondance pour cela.

str.search( 'Yes' )

renverra la position du match, ou -1 s'il n'est pas trouvé.

117
hookedonwinter

Autrement:

var testStr = "This is a test";

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

** Testé sur Firefox, Safari 6 et Chrome 36 **

26
Andy Braham

Il est assez tard pour écrire cette réponse, mais j'ai quand même pensé à l'inclure. String.prototype a maintenant une méthode includes qui peut vérifier la sous-chaîne. Cette méthode est sensible à la casse.

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

Pour vérifier une sous-chaîne, l'approche suivante peut être adoptée:

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

Consultez le documentation pour en savoir plus.

26
Munim Dibosh

ECMAScript 6 introduit String.prototype.includes , précédemment nommé contains.

Il peut être utilisé comme ceci:

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

Il accepte également un deuxième argument facultatif qui spécifie la position à partir de laquelle commencer la recherche:

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

Il peut être polyfilled pour le faire fonctionner sur les anciens navigateurs.

13
Oriol

Vous pouvez utiliser ce Polyfill en ie et en chrome

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

Retourne le nombre de fois que le mot clé est inclus dans la chaîne.

var count = "I have one keyword".match(/keyword/g);
var clean_count = !count ? false : count.length;
8
Kareem

La méthode includes () détermine si une chaîne peut être trouvée dans une autre chaîne, en renvoyant true ou false selon le cas.

Syntaxe: -string.includes (searchString [ position])

searchString: -Une chaîne à rechercher dans cette chaîne.

position: -Optional. La position dans cette chaîne à laquelle commencer la recherche de searchString; La valeur par défaut est 0.

string = 'LOL';
console.log(string.includes('lol')); // returns false 
console.log(string.includes('LOL')); // returns true 
5
Parth Raval

Je sais que le meilleur moyen est str.indexOf(s) !== -1;http://hayageek.com/javascript-string-contains/

Je suggère une autre manière (str.replace(s1, "") !== str):

var str = "Hello World!", s1 = "Ello", s2 = "elloo";
alert(str.replace(s1, "") !== str);
alert(str.replace(s2, "") !== str);
3
Sherali Turdiyev

Si vous êtes capable d'utiliser des bibliothèques, vous trouverez peut-être que Lo-Dash La bibliothèque JS est très utile. Dans ce cas, allez de l'avant et vérifiez _.contains() (remplacé par _.includes() à partir de v4).

(Remarque La convention Lo-Dash nomme l'objet de bibliothèque _. N'oubliez pas de vérifier l'installation dans la même page pour le configurer pour votre projet.)

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

Dans votre cas, allez-y et utilisez:

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

..whichever celui que vous préférez.

2
Selfish

Vous pouvez également vérifier si le mot exact est contenu dans une chaîne. Par exemple.:

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

Usage:

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

Voici comment jQuery utilise sa méthode hasClass.

1
bashaus

Aucune de ces solutions ne fonctionnait pour moi car il y avait des espaces mais c'est ce que j'ai fait

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";
            }

        }
    }
0
Kingsley Mitchell