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

Normalement, j'attendrais String.contains() , mais il semble manquer.

Quel est un moyen raisonnable de vérifier cela?

7436
24 нояб. set gramm 24 nov. 2009-11-24 16:04 '09 à 16:04 2009-11-24 16:04
@ 49 réponses
  • 1
  • 2

Voici une liste des fonctionnalités actuelles:

1. (ES6) includes - allez à la réponse

 var string = "foo", substring = "oo"; string.includes(substring); 

2. ES5 et plus indexOf

 var string = "foo", substring = "oo"; string.indexOf(substring) !== -1; 

String.prototype.indexOf renvoie la position d'une chaîne dans une autre chaîne. Si non trouvé, il retournera -1 .

3. search - aller à la réponse

 var string = "foo", expr = /oo/; string.search(expr); 

4. lodash inclut - allez à la réponse

 var string = "foo", substring = "oo"; _.includes(string, substring); 

5. RegExp - allez à la réponse

 var string = "foo", expr = /oo/; // no quotes here expr.test(string); 

6. Match - aller à la réponse

 var string = "foo", expr = /oo/; string.match(expr); 

Les tests de performance montrent que indexOf peut être le meilleur choix si la rapidité compte.

11502
24 нояб. La réponse est donnée par Fabien Ménager le 24 nov. 2009-11-24 16:05 '09 à 16:05 2009-11-24 16:05

Vous pouvez facilement ajouter la méthode includes à la chaîne à l'aide de cette instruction:

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

Remarque: voir les commentaires ci-dessous pour un argument valide pour ne pas l'utiliser. Mon conseil: utilisez votre propre opinion.

border=0

Alternativement:

 if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } 
823
30 дек. Avi Flax réponse est le 30 décembre 2009-12-30 07:23 '10 à 7:23 am 2009-12-30 07:23

Le problème avec votre code est que javascript est sensible à la casse. Appel de méthode

 indexof() 

doit être

 indexof() 

Essayez de le réparer et voyez si cela vous aide:

 if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; } 
429
24 нояб. La réponse est donnée à Victor le 24 novembre. 2009-11-24 17:17 '09 à 17:17 2009-11-24 17:17

Il y a un string.includes dans ES6 :

 "potato".includes("to"); > true 

Veuillez noter que vous devrez peut-être télécharger es6-shim ou similaire pour que cela fonctionne dans les navigateurs plus anciens.

 require('es6-shim') 
361
07 янв. la réponse est donnée à eliocs le 07 janvier . 2013-01-07 13:23 '13 à 13:23 2013-01-07 13:23
 var index = haystack.indexOf(needle); 
341
24 нояб. la réponse est donnée pixeline 24 nov. 2009-11-24 16:06 '09 à 16:06 2009-11-24 16:06

Vous pouvez utiliser la méthode JavaScript search() .

Syntaxe: string.search(regexp)

Retourne la position d'une correspondance ou -1 si une correspondance n'a pas été trouvée.

Voir des exemples: jsref_search

Vous n'avez pas besoin d'une syntaxe d'expression régulière complexe. Si vous ne les connaissez pas, il effectuera une simple st.search("title") . Si vous voulez que votre test respecte la casse, vous devez effectuer st.search(/title/i) .

237
05 марта '10 в 12:53 2010-03-05 12:53 La réponse est donnée par Tardis le 05 mars '10 à 12:53 2010-03-05 12:53

String.prototype.includes() été introduit dans ES6.

Détermine si une chaîne peut être trouvée dans une autre chaîne, en renvoyant respectivement true ou false.

La syntaxe

 var contained = str.includes(searchString [, position]); 

Paramètres

 searchString 

La chaîne à rechercher à l'intérieur de cette chaîne.

 position 

La position dans cette chaîne où vous souhaitez démarrer la recherche searchString par défaut 0.

Exemple

21 окт. réponse donnée par Aniket Kulkarni le 21 octobre. 2013-10-21 08:31 13 à 8h31 du 2013-10-21 08:31

Si vous cherchez une alternative pour écrire le check-moche -1, ajoutez plutôt un ~ tilde.

 if (~haystack.indexOf('needle')) alert('found'); 

Joe Zimmerman - vous verrez que l'utilisation de ~ on -1 le convertit en 0. Le nombre 0 est faux, ce qui signifie qu'il sera calculé comme faux lorsqu'il sera converti en booléen. Au début, cela peut ne pas sembler très fort, mais souvenez-vous que des fonctions, telles que indexOf, renvoient -1 lorsque la requête est introuvable. Cela signifie qu'au lieu d'écrire quelque chose comme ceci:

 if (someStr.indexOf("a") >= 0) { // Found it } else { // Not Found } 

Vous pouvez maintenant avoir moins de caractères dans le code pour pouvoir écrire par exemple:

 if (~someStr.indexOf("a")) { // Found it } else { // Not Found } 

Plus de détails ici

120
12 мая '14 в 1:22 2014-05-12 01:22 La réponse est donnée par Christian Landgren le 12 mai '14 à 1:22 2014-05-12 01:22

Cette partie du code devrait bien fonctionner:

 var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic } 
82
29 мая '12 в 10:46 2012-05-29 10:46 la réponse est donnée par vaibhav le 29 mai '12 à 10:46 2012-05-29 10:46

La manière générale d'écrire la méthode contains en JavaScript :

 if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; } 

L'opérateur de négation au niveau du bit ( ~ ) est utilisé pour convertir -1 en 0 (Falsey), et toutes les autres valeurs seront non nulles (true).

Les opérateurs avec double négation booléenne sont utilisés pour traduire les nombres en nombres logiques.

77
13 сент. la réponse est donnée zzzzBov 13 sep . 2012-09-13 06:45 '12 à 6:45 am 2012-09-13 06:45

Dans ES5

76
08 авг. la réponse est donnée à Nisar le 08 août. 2015-08-08 14:44 '15 à 14h44 2015-08-08 14:44

Au lieu d'utiliser des extraits de code trouvés ici ou là sur Internet, vous pouvez également utiliser une bibliothèque bien testée et documentée. Deux options que je recommanderais:


Option 1: Utiliser Lodash : il includes :

 _.includes('foobar', 'ob'); // → true 

Lodash est la dépendance la plus populaire de la bibliothèque javascript pour npm et dispose de nombreuses méthodes utiles pour l'utilitaire javascript. Donc, pour de nombreux projets, vous le souhaitez toujours; -)


La deuxième option: Ou utilisez Underscore.string : il a une méthode d' include :

 _.str.include('foobar', 'ob'); // → true 

Voici la description de Underscore.string, elle ajoute seulement 9 Ko, mais vous offre tous les avantages d'une bibliothèque bien testée et documentée sur les fragments de code copy'n'paste:

Underscore.string est une bibliothèque JavaScript facilitant la manipulation de chaînes, une extension de Underscore.js, inspirée de Prototype.js, Right.js, Underlining et d'un beau >

Underscore.string vous fournit plusieurs fonctions utiles: créer, nettoyer, inclure, compter, escapeHTML, unescapeHTML, insérer, épisser, commencerAvec, commence, avec en-têtes, rognage, rognage, etc.

Notez que Underscore.string est affecté par Underscore.js , mais peut être utilisé sans lui.


Dernier point mais non le moindre: la méthode includes est fournie avec la version JavaScript ES6:

 'foobar'.includes('ob'); // → true 

La plupart des navigateurs modernes le prennent déjà en charge, faites attention au tableau de compatibilité ES6 .

64
13 дек. La réponse est donnée nachtigall le 13 décembre 2013-12-13 23:05 13 à 23h05 2013-12-13 23h05

Vous pouvez utiliser le sélecteur jQuery :contains .

 $("div:contains('John')") 

Note ici: contient-sélecteur

63
14 марта '11 в 5:10 2011-03-14 05:10 la réponse est donnée à Chorinator le 14 mars 2011 à 5h10 du matin 2011-03-14 05:10

Utilisez une expression régulière:

RegExp.test(string)

61
24 нояб. la réponse est donnée à rahul le 24 novembre 2009-11-24 16:13 '09 à 16:13 2009-11-24 16:13

Cela a juste fonctionné pour moi. Il sélectionne les lignes qui ne contiennent pas le terme "Supprimé:"

 if (eventString.indexOf("Deleted:") == -1) 
49
21 окт. réponse donnée à writtinfool le 21 octobre. 2011-10-21 00:50 '11 à 0:50 2011-10-21 00:50

Une autre façon de faire est:

Vous pouvez utiliser la fonction de correspondance, c'est-à-dire quelque chose comme:

 x = "teststring"; if (x.match("test")) { // Code } 

match () peut également fonctionner avec une expression régulière:

 x = "teststring"; if (x.match(/test/i)) { // Code } 
49
29 сент. Réponse donnée par David Craig 29 sept. 2012-09-29 13:40 '12 à 13:40 2012-09-29 13:40

Vous avez cherché .indexOf MDN .

indexOf retournera l'indice en indice. L'index sera en corrélation avec le début de la sous-chaîne. S'il n'y a pas de correspondance, -1 est renvoyé. Voici une démonstration simple de ce concept:

29 авг. Réponse donnée par Travis J 29 août 2013-08-29 02:23 '13 à 2:23 2013-08-29 02:23

Vous devez appeler indexOf avec le capital "O", comme indiqué. Il convient également de noter que dans un mot réservé de classe JavaScript, vous devez utiliser className pour obtenir cet attribut de données. La raison pour laquelle il est susceptible d'échouer est qu'il renvoie une valeur null. Vous pouvez faire ce qui suit pour obtenir la valeur de votre classe ...

 var test = elm.getAttribute("className"); //or var test = elm.className 
48
24 нояб. La réponse est donnée par MillsJROSS le 24 nov. 2009-11-24 18:52 '09 à 18:52 2009-11-24 18:52

Puisque la question est très populaire, j'ai pensé que je pourrais ajouter un peu de saveur moderne au code.

 // const : creates an immutable constant const allLinks = document.getElementsByTagName("a"); // [].reduce.call : gives access to the reduce method on a HTMLCollection // () => {} : ES6 arrow function const foundLinks = [].reduce.call(allLinks, (sum, link) => { // bitwise OR : converts the boolean value to a number return sum + (link.classList.contains("title") | 0); }, 0); // template literal console.log('Found ${foundLinks || "no"} title class'); 

En passant, la bonne réponse est incorrecte indexOf ou indexOf non standard. Charger une bibliothèque externe (surtout si le code est écrit en javascript pur), String.prototype avec String.prototype ou utiliser une expression régulière est allé un peu trop loin.

34
27 окт. Réponse de Jay Harris 27 octobre 2013-10-27 18:53 13 à 18:53 2013-10-27 18:53

Il existe un moyen élégant et meilleur de le faire, et il utilise l'opérateur (BitWise NOT).

 if(~"John".indexOf("J")) { alert("Found") } else { alert("Not Found"); } 

Bitwise ne convertit pas "x" en - (x + 1), donc si x est obtenu -1 à partir de la méthode indexOf, il sera converti en - (-1 + 1) = -0, ce qui est une valeur fausse.

27
07 дек. La réponse est donnée à Kiba 07 déc. 2014-12-07 14:05 14 à 14:05 2014-12-07 14:05

String.prototype.indexOf() ou String.prototype.search() ?!

Comme déjà mentionné, les chaînes JavaScript ont à la fois indexOf et search .

La principale différence entre les deux est que indexOf utilisé uniquement pour les sous-chaînes simples, alors que la search prend également en charge les expressions régulières. Bien sûr, l'avantage d'utiliser indexOf est qu'il est plus rapide.

Voir aussi En JavaScript, quelle est la différence entre indexOf () et search ()? .

Implémentation de votre propre méthode String.prototype.contains()

Si vous voulez ajouter votre propre méthode includes à chaque ligne, la meilleure façon de le faire serait @zzzzBov :

 if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; } 

Vous l'utiliseriez comme suit:

 'Hello World'.contains('orl'); 

Implémentation d'un utilitaire personnalisé

Il est généralement déconseillé d'ajouter vos propres méthodes à des objets standard en JavaScript, par exemple, car cela pourrait compromettre la compatibilité.

Si vous avez vraiment besoin de votre propre méthode includes et / ou d'autres méthodes de chaîne personnalisées, il est préférable de créer votre propre bibliothèque d'utilitaires et d'ajouter vos propres méthodes de chaîne à cette bibliothèque:

 var helper = {}; helper.string = { contains : function (haystack, needle) { return !!~haystack.indexOf(needle); }, ... }; 

Vous l'utiliseriez comme suit:

 helper.string.contains('Hello World', 'orl'); 

Utilisation d'une bibliothèque d'utilitaires tiers

Si vous ne souhaitez pas créer votre propre bibliothèque de support, vous avez bien sûr toujours la possibilité d'utiliser une bibliothèque d'utilitaires tiers. Comme @nachtigall a été mentionné, les plus populaires sont Lodash et Underscore.js .

En Lodash, vous pouvez utiliser _.includes() , que vous utilisez comme suit:

 _.includes('Hello World', 'orl'); 

Dans Underscore.js, vous pouvez utiliser _.str.include() , que vous utilisez comme suit:

 _.str.include('Hello World', 'orl'); 
24
21 февр. Réponse donnée par John Slegers le 21 février. 2016-02-21 19:52 '16 à 19:52 2016-02-21 19:52

La solution la plus simple

 if (!String.prototype.contains) { String.prototype.contains= function() { return String.prototype.indexOf.apply(this, arguments) !== -1; }; } 

Vous pouvez utiliser comme suit

 "hello".contains("he") // true "hello world".contains("lo w")//true "hello world".contains("lo wa")//false "hello world".contains(" ")//true "hello world".contains(" ")//false 

Lien MDN

23
21 авг. réponse donnée par Sriramajeyam Sugumaran le 21 août 2015-08-21 12:45 '15 à 12h45 2015-08-21 12:45
22
08 нояб. la réponse est donnée par user663031 le 08 nov. 2014-11-08 08:38 14 à 08h38 2014-11-08 08:38

Exemple

 var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found } 
22
12 нояб. Réponse donnée par Ali Abbas le 12 novembre 2015-11-12 16:11 '15 à 16:11 2015-11-12 16:11

Code JavaScript pour utiliser la méthode contains dans un tableau:

 <html> <head> <h2>Use of contains() method</h2> <script> Array.prototype.contains = function (element) { for (var i = 0; i < this.length; i++) { if (this[i] == element) { return true; } } return false; } arr1 = ["Rose", "India", "Technologies"]; document.write("The condition is "+arr1.contains("India")+"<br>"); </script> </head> <b>[If the specified element is present in the array, it returns true otherwise returns false.]</b> </html> 

Dans ce code, la méthode contains détermine si l'élément spécifié est présent ou non dans le tableau. Si l'élément spécifié est présent dans le tableau, il renvoie true, sinon il renvoie false.

21
28 февр. La réponse est donnée par Tarun Gupta le 28 février. 2013-02-28 10:50 '13 à 10:50 2013-02-28 10:50

Pour collecter des solutions valables:

19
16 июня '15 в 15:08 2015-06-16 15:08 la réponse est donnée le 16 juin à 15:08 le 15 juin 2015-06-16 15:08

Depuis qu'il y a une plainte à propos de l'utilisation du prototype et que l'utilisation de indexOf rend votre code moins lisible et que l'expression rationnelle est saturée:

 function stringContains(inputString, stringToFind) { return (inputString.indexOf(stringToFind) != -1); } 

C'est un compromis que j'ai eu.

17
22 авг. la réponse est donnée à Tjaart le 22 août. 2013-08-22 14:40 '13 à 14:40 2013-08-22 14:40

Javascript

  var str = "My big string contain apples and oranges"; var n = str.indexOf("apples"); alert(n); //will alert 22, -1 if not found 

Jquery

  <p>My big string contain apples and oranges</p> alert($("p:contains(apples)")[0] != undefined); //will alert true if found 
17
16 дек. La réponse est donnée par Alain Gauthier le 16 décembre. 2014-12-16 19:48 '14 à 19:48 2014-12-16 19:48

Utilisez la chaîne la plus simple et la plus intégrée, ie match() dans la chaîne. Pour atteindre vos objectifs, procédez comme suit:

 var stringData ="anyString Data"; var subStringToSearch = "any"; // This will give back the substring if matches and if not returns null var doesContains = stringData.match(subStringToSearch); if(doesContains !=null) { alert("Contains Substring"); } 
13
02 мая '14 в 23:08 2014-05-02 23:08 la réponse est donnée par Ankur Madaan le 02 mai 2014 à 23:08 2014-05-02 23:08

Le moyen le plus simple consiste à utiliser indexOf . Pour vérifier simplement la string pour la sous-chaîne, vous pouvez utiliser cette méthode:

 string = "asdf"; substr = "as"; alert(string.indexOf(substr) == -1 ? false : true); 

Comme vous avez besoin de la fonction string.contains() , vous pouvez l’implémenter vous-même comme suit:

 String.prototype.contains = function(test) { return this.indexOf(test) == -1 ? false : true; }; 

Vous pouvez maintenant utiliser cette méthode plus courte pour vérifier si une chaîne contient une sous-chaîne spéciale:

 string = "asdf"; alert(string.contains("as")); 

Voici le JSFiddle .

13
27 мая '14 в 15:52 2014-05-27 15:52 la réponse est donnée par frieder le 27 mai 2014 à 15:52 2014-05-27 15:52
  • 1
  • 2