Як праверыць, ці ўтрымоўвае радок падрадок у JavaScript?

Звычайна я чакаў бы String.contains() , але, падобна, яго няма.

Які разумны спосаб праверыць гэта?

7436
24 нояб. зададзены gramm 24 лістапада. 2009-11-24 16:04 '09 у 16:04 2009-11-24 16:04
@ 49 адказаў
  • 1
  • 2

Вось спіс бягучых магчымасцяў:

1. (ES6) includes - перайдзіце да адказу

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

2. ES5 і старэй indexOf

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

String.prototype.indexOf вяртае пазіцыю радкі ў іншы радку. Калі не знойдзены, ён верне -1 .

3. search - перайдзіце да адказу

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

4. lodash ўключае - перайдзіце да адказу

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

5. RegExp - перайдзіце да адказу

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

6. Матч - пайсці, каб адказаць

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

Тэсты прадукцыйнасці паказваюць, што indexOf можа быць лепшым выбарам, калі справа даходзіць да таго, што хуткасць мае значэнне.

11502
24 нояб. адказ дадзены Fabien Ménager 24 лістапада. 2009-11-24 16:05 '09 у 16:05 2009-11-24 16:05

Вы можаце лёгка дадаць метад contains да String з дапамогай гэтага аператара:

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

Заўвага: гл. Каментары ніжэй для дапушчальнага аргументу для таго, каб не выкарыстоўваць гэта. Мая парада: выкарыстоўвайце сваё ўласнае меркаванне.

border=0

У якасці альтэрнатывы:

 if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } 
823
30 дек. адказ дадзены Avi Flax 30 снеж. 2009-12-30 07:23 '10 у 7:23 2009-12-30 07:23

Праблема з вашым кодам заключаецца ў тым, што JavaScript адчувальны да рэгістра. выклік метаду

 indexof() 

павінен быць

 indexof() 

Паспрабуйце яго выправіць і паглядзіце, ці дапамагае гэта:

 if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; } 
429
24 нояб. адказ дадзены Victor 24 лістапада. 2009-11-24 17:17 '09 у 17:17 2009-11-24 17:17

Існуе string.includes ў ES6 :

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

Звярніце ўвагу, што вам можа спатрэбіцца загрузіць es6-shim ці аналагічны, каб гэта працавала ў старых браўзэрах.

 require('es6-shim') 
361
07 янв. адказ дадзены eliocs 07 студз. 2013-01-07 13:23 '13 у 13:23 2013/01/07 13:23
 var index = haystack.indexOf(needle); 
341
24 нояб. адказ дадзены pixeline 24 лістапада. 2009-11-24 16:06 '09 у 16:06 2009-11-24 16:06

Вы можаце выкарыстоўваць метад JavaScript search() .

Сінтаксіс: string.search(regexp)

Вяртае пазіцыю супадзення або -1, калі супадзенне не знойдзена.

См. Прыклады: jsref_search

Вам не патрэбен складаны сінтаксіс рэгулярных выразаў. Калі вы не знаёмыя з імі, гэта зробіць просты st.search("title") . Калі вы хочаце, каб ваш тэст быў неадчувальным да рэгістра, вы павінны зрабіць st.search(/title/i) .

237
05 марта '10 в 12:53 2010-03-05 12:53 адказ дадзены Tardis 05 сакавіка '10 у 12:53 2010-03-05 00:53

String.prototype.includes() быў уведзены ў ES6.

Вызначае, ці можа адзін радок быць знойдзена ў іншы радку, вяртаючы true або false адпаведна.

сінтаксіс

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

параметры

 searchString 

Радок, якую трэба шукаць унутры гэтага радка.

 position 

Пазіцыя ў гэтым радку, у якой трэба пачынаць пошук searchString па змаўчанні 0.

прыклад

167
21 окт. адказ дадзены Aniket Kulkarni 21 каст. 2013-10-21 08:31 '13 у 08:31 2013/10/21 08:31

Калі вы шукалі альтэрнатыву для напісання чэк-выродлівага -1, замест гэтага вы дадаеце ~ Тыльда.

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

Джо Цімермана - вы ўбачыце, што выкарыстанне ~ on -1 пераўтворыць яго ў 0. Лік 0 з'яўляецца значэнне false, што азначае, што ён будзе вылічвацца як false пры пераўтварэнні ў булева. Спачатку гэта можа здацца не вельмі моцным, але памятайце, што функцыі, такія як indexOf, вяртаюць -1, калі запыт не знойдзены. Гэта азначае, што замест таго, каб пісаць нешта падобнае на гэта:

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

Цяпер у вас можа быць менш знакаў у кодзе, каб вы маглі пісаць напрыклад:

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

Больш падрабязна падрабязней тут

120
12 мая '14 в 1:22 2014-05-12 01:22 адказ дадзены Christian Landgren 12 мая '14 у 01:22 2014/05/12 01:22

Гэтая частка кода павінна добра працаваць:

 var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic } 
82
29 мая '12 в 10:46 2012-05-29 10:46 адказ дадзены vaibhav 29 мая '12 а 10:46 2012-05-29 10:46

Агульны спосаб запісу метаду contains у JavaScript :

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

Аператар пабітавае адмаўлення ( ~ ) выкарыстоўваецца, каб ператварыць -1 ў 0 (falsey), а ўсе астатнія значэння будуць выдатнымі ад нуля (праўда).

Аператары з падвойным булева адмаўленнем выкарыстоўваюцца для перакладу лікі ў лагічны.

77
13 сент. адказ дадзены zzzzBov 13 сент. 2012-09-13 06:45 '12 ў 6:45 2012/09/13 06:45

У ES5

76
08 авг. адказ дадзены Nisar 08 жнів. 2015-08-08 14:44 '15 у 14:44 2015/08/08 14:44

Замест выкарыстання фрагментаў кода, знойдзеных тут і там у Інтэрнэце, вы таксама можаце выкарыстоўваць добра пратэставаны і задакументаваць бібліятэку. Два варыянты, якія я б рэкамендаваў:


1-й варыянт: Выкарыстоўвайце Lodash : у яго ёсць includes :

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

Lodash - самая папулярная залежнасць бібліятэкі javascript для npm і мае мноства карысных метадаў ўтыліты javascript. Так што для многіх праектаў вы ўсё роўна захочаце гэтага; -)


Другая опцыя: Ці выкарыстоўвайце Underscore.string : у яе ёсць include метад:

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

Вось апісанне Underscore.string, яно проста дадае 9kb, але дае вам усе перавагі, якія добра пратэставаны і дакументаваная бібліятэка мае над фрагментамі кода copy'n'paste:

Underscore.string - гэта бібліятэка JavaScript для зручнай маніпуляцыі з радкамі, пашырэнне для Underscore.js, натхнёнае Prototype.js, Right.js, Падкрэсліванне і прыгожы мова Ruby.

Underscore.string дае вам некалькі карысных функцый: capize, чысты, ўключае, count, escapeHTML, unescapeHTML, ўстаўку, зрошчванне, startsWith, endsWith, загалоўкі, абрэзка, абразанне і г.д.

Звярніце ўвагу, што на Underscore.string ўплывае Underscore.js , але можа выкарыстоўвацца без яго.


Апошняе не найменшую: З версіяй JavaScript ES6 пастаўляецца убудаваны метад includes :

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

Большасць сучасных браўзэраў ўжо падтрымліваюць яго, звярніце ўвагу на табліцу сумяшчальнасці ES6 .

64
13 дек. адказ дадзены nachtigall 13 снеж. 2013-12-13 23:05 '13 а 23:05 2013/12/13 23:05

Вы можаце выкарыстоўваць селектар jQuery :contains .

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

Адзначце тут: contains-selector

63
14 марта '11 в 5:10 2011-03-14 05:10 адказ дадзены Chorinator 14 сакавіка '11 у 05:10 2011-03-14 05:10

Выкарыстоўвайце рэгулярны выраз:

RegExp.test(string)

61
24 нояб. адказ дадзены rahul 24 лістапада. 2009-11-24 16:13 '09 у 16:13 2009-11-24 16:13

Гэта проста спрацавала для мяне. Ён выбірае радкі, якія не ўтрымліваюць тэрмін "Выдалена:"

 if (eventString.indexOf("Deleted:") == -1) 
49
21 окт. адказ дадзены writtinfool 21 каст. 2011-10-21 00:50 '11 у 0:50 2011-10-21 00:50

Іншы спосаб зрабіць гэта:

Вы можаце выкарыстоўваць функцыю адпаведнасці, то ёсць нешта накшталт:

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

match () таксама можа працаваць з рэгулярным выразам:

 x = "teststring"; if (x.match(/test/i)) { // Code } 
49
29 сент. адказ дадзены David Craig 29 сент. 2012-09-29 13:40 '12 А 13:40 2012/09/29 13:40

Вы шукалі .indexOf MDN .

indexOf будзе вяртаць індэкс падрадковых падрадка. Індэкс будзе карэляваць з тым, дзе пачынаецца падрадок. Калі супадзення няма, вяртаецца -1. Вось простая дэманстрацыя гэтай канцэпцыі:

29 авг. адказ дадзены Travis J 29 жнів. 2013-08-29 02:23 '13 у 2:23 2013/08/29 02:23

Вам трэба выклікаць indexOf з капіталам "O", як паказана. Варта таксама адзначыць, што ў класе JavaScript зарэзерваваныя слова, вы павінны выкарыстоўваць className для атрымання гэтага атрыбуту дадзеных. Прычына, па якой ён, верагодна, трывае няўдачу, заключаецца ў тым, што ён вяртае нулявое значэнне. Вы можаце зрабіць наступнае, каб атрымаць значэнне вашага класа ...

 var test = elm.getAttribute("className"); //or var test = elm.className 
48
24 нояб. адказ дадзены MillsJROSS 24 лістапада. 2009-11-24 18:52 '09 у 18:52 2009-11-24 18:52

Паколькі пытанне даволі папулярны, я падумаў, што магу дадаць у код трохі сучасны водар.

 // 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'); HTMLCollection // 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'); 

BTW, правільным адказам з'яўляецца няправільны indexOf або нестандартныя String.contains . Загрузка знешняй бібліятэкі (асабліва калі код напісаны ў чыстым JavaScript) або важдацца з String.prototype або з выкарыстаннем назваў паведамленняў трохі перабраў.

34
27 окт. адказ дадзены Jay Harris 27 каст. 2013-10-27 18:53 '13 у 18:53 2013/10/27 18:53

Існуе гладкі і лепшы спосаб зрабіць гэта, і ён выкарыстоўвае аператар (BitWise NOT).

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

Пабітавае не пераўтварае "x" ў - (x + 1), таму, калі x атрымліваецца -1 з метаду indexOf, то ён будзе ператвораны ў - (-1 + 1) = -0, што з'яўляецца ілжывым значэнне.

27
07 дек. адказ дадзены Kiba 07 снеж. 2014-12-07 14:05 '14 у 14:05 2014/12/07 14:05

String.prototype.indexOf() або String.prototype.search() ?!

Як ужо згадвалася, радкі JavaScript маюць як indexOf , так і search .

Ключавое адрозненне паміж імі складаецца ў тым, што indexOf выкарыстоўваецца толькі для простых падрадкоў, тады як search таксама падтрымлівае рэгулярныя выразы. Вядома, перавага выкарыстання indexOf заключаецца ў тым, што ён хутчэй.

Гл. Таксама У JavaScript, у чым розніца паміж indexOf () і search ()? .

Ўкараненне ўласнай метаду String.prototype.contains()

Калі вы хочаце дадаць свой уласны метад contains да кожнай радку, лепшым спосабам зрабіць гэта будзе @zzzzBov :

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

Вы б выкарыстоўвалі яго наступным чынам:

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

Рэалізацыя карыстацкай ўтыліты

Звычайна не рэкамендуецца дадаваць ўласныя метады да стандартных аб'ектаў у JavaScript, напрыклад, таму што гэта можа парушыць сумяшчальнасць.

Калі вам сапраўды патрэбен уласны метад contains і / або іншыя наладжвальныя радковыя метады, лепш стварыць сваю ўласную бібліятэку ўтыліты і дадаць у гэтую бібліятэку свае ўласныя радковыя метады:

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

Вы б выкарыстоўвалі яго наступным чынам:

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

Выкарыстанне іншай бібліятэкі ўтыліты

Калі вы не хочаце ствараць сваю ўласную дапаможную бібліятэку, ёсць, вядома, заўсёды магчымасць выкарыстоўваць іншую бібліятэку ўтыліты. Як згадвалася @nachtigall , найбольш папулярнымі з'яўляюцца Lodash і Underscore.js .

У Lodash вы можаце выкарыстоўваць _.includes() , які вы выкарыстоўваеце наступным чынам:

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

У Underscore.js вы можаце выкарыстоўваць _.str.include() , які вы выкарыстоўваеце наступным чынам:

 _.str.include('Hello World', 'orl'); 
24
21 февр. адказ дадзены John Slegers 21 февр. 2016-02-21 19:52 '16 у 19:52 2016/02/21 19:52

Найпростае абыходнае рашэнне

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

вы можаце выкарыстоўваць наступным чынам

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

спасылка MDN

23
21 авг. адказ дадзены Sriramajeyam Sugumaran 21 жнів. 2015-08-21 12:45 '15 года ў 12:45 2015/08/21 00:45
22
08 нояб. адказ дадзены user663031 08 лістапада. 2014-11-08 08:38 '14 у 08:38 2014/11/08 08:38

прыклад

 var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found } 
22
12 нояб. адказ дадзены Ali Abbas 12 лістапада. 2015-11-12 16:11 '15 у 16:11 2015/11/12 16:11

JavaScript-код для выкарыстання метаду contains ў масіве:

 <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> array <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> 

У дадзеным кодзе метад contains вызначае, ці прысутнічае ўказаны элемент у масіве ці не. Калі правераны элемент прысутнічае ў масіве, ён вяртае true, інакш ён вяртае false.

21
28 февр. адказ дадзены Tarun Gupta 28 февр. 2013-02-28 10:50 '13 у 10:50 2013/02/28 10:50

Каб сабраць нейкія дапушчальныя рашэнні:

19
16 июня '15 в 15:08 2015-06-16 15:08 адказ дадзены shA.t 16 чэрвеня '15 у 15:08 2015/06/16 15:08

Бо ёсць скарга на выкарыстанне прататыпа, і паколькі выкарыстанне indexOf робіць ваш код менш чытаным і паколькі regexp перапоўнены:

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

Гэта кампраміс, у які я трапіў.

17
22 авг. адказ дадзены Tjaart 22 жнів. 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 дек. адказ дадзены Alain Gauthier 16 снеж. 2014-12-16 19:48 '14 у 19:48 2014/12/16 19:48

Выкарыстоўвайце убудаваную і найпростую радок IE match() у радку. Каб дасягнуць таго, што вы чакаеце, зрабіце наступнае:

 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"); } and if not returns null 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 адказ дадзены Ankur Madaan 02 мая '14 а 23:08 2014/05/02 23:08

Самы просты спосаб - выкарыстоўваць indexOf. Каб проста праверыць радок string для падрадка substr , вы можаце выкарыстоўваць гэты метад:

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

Як вам патрэбна функцыя string.contains() , вы можаце рэалізаваць яе самастойна наступным чынам:

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

Цяпер вы можаце выкарыстоўваць гэты метад ecen shorter, каб праверыць, ці ўтрымоўвае радок спецыяльную падрадок:

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

Вось JSFiddle .

13
27 мая '14 в 15:52 2014-05-27 15:52 адказ дадзены frieder 27 мая '14 у 15:52 2014/05/27 15:52
  • 1
  • 2

Іншыя пытанні па пазнаках або Задайце пытанне