Wie prüfe ich, ob eine Zeichenfolge eine Teilzeichenfolge in Javascript enthält?
Normalerweise würde ich String.contains()
erwarten, aber es scheint zu fehlen.
Was ist eine vernünftige Möglichkeit, dies zu überprüfen?
- 1
- 2
Hier ist eine Liste der aktuellen Funktionen:
1. (ES6) includes
- gehe zur Antwort
var string = "foo", substring = "oo"; string.includes(substring);
2. ES5 und älterer indexOf
var string = "foo", substring = "oo"; string.indexOf(substring) !== -1;
String.prototype.indexOf
gibt die Position einer Zeichenfolge in einer anderen Zeichenfolge zurück. Wenn nicht gefunden, wird -1
.
3. search
- zur Antwort gehen
var string = "foo", expr = /oo/; string.search(expr);
4. lodash beinhaltet - gehen Sie zur Antwort
var string = "foo", substring = "oo"; _.includes(string, substring);
5. RegExp - zur Antwort gehen
var string = "foo", expr = /oo/; // no quotes here expr.test(string);
6. Match - zur Antwort gehen
var string = "foo", expr = /oo/; string.match(expr);
Leistungstests zeigen, dass indexOf
die beste Wahl ist, wenn es auf Geschwindigkeit ankommt.
Sie können die contains
Methode mit der folgenden Anweisung leicht zum String hinzufügen:
String.prototype.contains = function(it) { return this.indexOf(it) != -1; };
Hinweis: In den nachfolgenden Kommentaren finden Sie ein gültiges Argument, wenn Sie es nicht verwenden. Mein Rat: Verwenden Sie Ihre eigene Meinung.

Alternativ:
if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; }
Das Problem mit Ihrem Code ist, dass bei Javascript die Groß- und Kleinschreibung beachtet wird. Methodenaufruf
indexof()
muss sein
indexof()
Versuchen Sie es zu beheben und sehen Sie, ob es hilft:
if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; }
Es gibt eine string.includes
in ES6 :
"potato".includes("to"); > true
Bitte beachten Sie, dass Sie möglicherweise es6-shim
oder ähnliches herunterladen es6-shim
, damit dies in älteren Browsern funktioniert.
require('es6-shim')
Sie können die JavaScript-Methode search()
verwenden.
Syntax: string.search(regexp)
Gibt die Position einer Übereinstimmung zurück oder -1, wenn keine Übereinstimmung gefunden wurde.
Siehe Beispiele: jsref_search
Sie benötigen keine komplexe Syntax für reguläre Ausdrücke. Wenn Sie mit ihnen nicht vertraut sind, wird eine einfache st.search("title")
. Wenn Sie möchten, dass Ihr Test zwischen Groß- und Kleinschreibung unterscheidet, müssen Sie st.search(/title/i)
.
String.prototype.includes()
wurde in ES6 eingeführt.
Bestimmt, ob eine Zeichenfolge in einer anderen Zeichenfolge gefunden werden kann, und gibt true bzw. false zurück.
Syntax
var contained = str.includes(searchString [, position]);
Parameter
searchString
Die Zeichenfolge, nach der in dieser Zeichenfolge gesucht werden soll.
position
Die Position in dieser Zeichenfolge, an der Sie die Suchzeichenfolge der Suche starten möchten, standardmäßig 0.
Beispiel
167
Wenn Sie nach einer Alternative zum Schreiben des Check-ugly-1 gesucht haben, fügen Sie stattdessen eine ~ Tilde hinzu.
if (~haystack.indexOf('needle')) alert('found');
Joe Zimmerman - Sie werden sehen, dass Sie mit ~ on -1 den Wert 0 verwenden. Die Zahl 0 ist falsch, dh sie wird bei der Konvertierung in einen booleschen Wert als falsch berechnet. Zunächst scheint dies nicht sehr stark zu sein. Denken Sie jedoch daran, dass Funktionen wie indexOf -1 zurückgeben, wenn die Abfrage nicht gefunden wird. Das bedeutet, anstatt etwas zu schreiben:
if (someStr.indexOf("a") >= 0) { // Found it } else { // Not Found }
Sie können jetzt weniger Zeichen im Code enthalten, so dass Sie beispielsweise schreiben können:
if (~someStr.indexOf("a")) { // Found it } else { // Not Found }
Weitere Details hier
Dieser Teil des Codes sollte gut funktionieren:
var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic }
Die allgemeine Methode zum Erstellen der " contains
-Methode in JavaScript :
if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; }
Der bitweise Negationsoperator ( ~
) wird verwendet, um -1
in 0
(Falsey) umzuwandeln, und alle anderen Werte sind ungleich Null (True).
Operatoren mit doppelter Boolescher Negation werden verwendet, um Zahlen in logische Zahlen zu übersetzen.
In ES5
76
Anstelle von Code-Snippets, die hier und dort im Internet zu finden sind, können Sie auch eine bewährte und dokumentierte Bibliothek verwenden. Zwei Optionen, die ich empfehlen würde:
Option 1: Verwenden Sie Lodash : Es includes
:
_.includes('foobar', 'ob'); // → true
Lodash ist die beliebteste Javascript-Bibliotheksabhängigkeit für npm und hat viele nützliche Javascript-Dienstprogramm-Methoden. Für viele Projekte möchten Sie das immer noch. -)
Die zweite Option: Oder verwenden Sie Underscore.string : Es gibt eine include
Methode:
_.str.include('foobar', 'ob'); // → true
Hier ist die Beschreibung von Underscore.string, sie fügt lediglich 9kb hinzu, bietet Ihnen jedoch alle Vorteile, die eine bewährte und dokumentierte Bibliothek auf copy'n'paste-Codefragmenten hat:
Underscore.string ist eine JavaScript-Bibliothek zur einfachen Bearbeitung von Strings, eine Erweiterung für Underscore.js, die von Prototype.js, Right.js, Underlining und einer schönen Ruby-Sprache inspiriert ist.
Underscore.string bietet Ihnen mehrere nützliche Funktionen: capize, clean, include, count, escapeHTML, unescapeHTML, insert, splicing, startsWith, endsWith, Header, Trimmen, Beschneiden usw.
Beachten Sie, dass Underscore.string von Underscore.js betroffen ist, aber auch ohne verwendet werden kann.
Zu guter Letzt: Die integrierte includes
Methode wird mit der ES6-JavaScript-Version geliefert:
'foobar'.includes('ob'); // → true
Die meisten modernen Browser unterstützen dies bereits, beachten Sie die ES6-Kompatibilitätstabelle .
Verwenden Sie einen regulären Ausdruck:
Es hat einfach für mich funktioniert. Er wählt Zeilen aus, die nicht den Begriff "Gelöscht" enthalten.
if (eventString.indexOf("Deleted:") == -1)
Ein anderer Weg, dies zu tun, ist:
Sie können die Übereinstimmungsfunktion verwenden, d. H.
x = "teststring"; if (x.match("test")) { // Code }
match () kann auch mit einem regulären Ausdruck arbeiten:
x = "teststring"; if (x.match(/test/i)) { // Code }
Sie haben nach .indexOf
MDN gesucht.
indexOf
gibt den Index zurück. Der Index korreliert mit dem Beginn der Teilzeichenfolge. Wenn es keine Übereinstimmung gibt, wird -1 zurückgegeben. Hier ist eine einfache Demonstration dieses Konzepts:
49
Sie müssen indexOf wie angegeben mit dem Großbuchstaben "O" aufrufen. Es ist auch zu beachten, dass Sie in einem JavaScript-Klasse-reservierten Wort className verwenden müssen, um dieses Datenattribut abzurufen. Der Grund für das Fehlschlagen ist wahrscheinlich, dass ein Nullwert zurückgegeben wird. Sie können Folgendes tun, um den Wert Ihrer Klasse zu erhalten ...
var test = elm.getAttribute("className"); //or var test = elm.className
Da die Frage sehr beliebt ist, dachte ich, ich könnte dem Code ein bisschen moderne Note verleihen.
// 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, die richtige Antwort ist falsches indexOf
oder nicht standardmäßiges String.contains
. Das Laden einer externen Bibliothek (insbesondere wenn der Code in reinem Javascript geschrieben ist) oder das Durcheinander mit String.prototype
oder die Verwendung eines regulären Ausdrucks ist etwas zu weit gegangen.
Es gibt einen schlanken und besseren Weg, dies zu tun, und es verwendet den Operator (BitWise NOT).
if(~"John".indexOf("J")) { alert("Found") } else { alert("Not Found"); }
Bitwise konvertiert "x" nicht in - (x + 1). Wenn also x aus der Methode indexOf -1 erhalten wird, wird es in - (-1 + 1) = -0 konvertiert. Dies ist ein falscher Wert.
String.prototype.indexOf()
oder String.prototype.search()
?!
Wie bereits erwähnt, haben JavaScript-Strings sowohl indexOf
als auch search
.
Der Hauptunterschied zwischen den beiden ist, dass indexOf
nur für einfache indexOf
verwendet wird, während die search
auch reguläre Ausdrücke unterstützt. Der Vorteil von indexOf
ist natürlich, dass es schneller ist.
Siehe auch In JavaScript, was ist der Unterschied zwischen indexOf () und search ()? .
Eigene Methode String.prototype.contains()
Wenn Sie jeder Zeile eine eigene Methode mit enthalten möchten, ist @zzzzBov der beste Weg, dies zu tun :
if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; }
Sie würden es wie folgt verwenden:
'Hello World'.contains('orl');
Ein benutzerdefiniertes Dienstprogramm implementieren
Es wird normalerweise nicht empfohlen, eigene Methoden zu Standardobjekten in JavaScript hinzuzufügen. Dies kann zum Beispiel die Kompatibilität beeinträchtigen.
Wenn Sie wirklich benötigen, dass Ihre eigene Methode und / oder andere benutzerdefinierte Zeichenfolgenmethoden verwendet werden, ist es besser, eine eigene Dienstprogrammbibliothek zu erstellen und dieser Bibliothek eigene Zeichenkettenmethoden hinzuzufügen:
var helper = {}; helper.string = { contains : function (haystack, needle) { return !!~haystack.indexOf(needle); }, ... };
Sie würden es wie folgt verwenden:
helper.string.contains('Hello World', 'orl');
Verwenden einer Dienstprogrammbibliothek eines Drittanbieters
Wenn Sie keine eigene unterstützende Bibliothek erstellen möchten, besteht natürlich immer die Möglichkeit, eine Dienstprogrammbibliothek eines Drittanbieters zu verwenden. Wie @nachtigall erwähnt wurde, sind Lodash und Underscore.js die beliebtesten.
In Lodash können Sie _.includes()
, das Sie wie folgt verwenden:
_.includes('Hello World', 'orl');
In Underscore.js können Sie _.str.include()
, das Sie wie folgt verwenden:
_.str.include('Hello World', 'orl');
Die einfachste Problemumgehung
if (!String.prototype.contains) { String.prototype.contains= function() { return String.prototype.indexOf.apply(this, arguments) !== -1; }; }
Sie können wie folgt verwenden
"hello".contains("he") // true "hello world".contains("lo w")//true "hello world".contains("lo wa")//false "hello world".contains(" ")//true "hello world".contains(" ")//false
ES6 enthält String.prototype.includes
.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
Beispiel
var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found }
JavaScript-Code für die Verwendung der contains
Methode in einem 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>
In diesem Code bestimmt die contains
Methode, ob das angegebene Element im Array vorhanden ist oder nicht. Wenn das angegebene Element im Array vorhanden ist, wird true zurückgegeben. Andernfalls wird false zurückgegeben.
Um einige gültige Lösungen zu sammeln:
19
Da es eine Beschwerde über die Verwendung eines Prototyps gibt und weil der Gebrauch von indexOf
den Code weniger lesbar macht und weil regexp voll ist:
function stringContains(inputString, stringToFind) { return (inputString.indexOf(stringToFind) != -1); }
Dies ist ein Kompromiss, den ich bekam.
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
Verwenden Sie den eingebauten und einfachsten String, dh match()
im String. Um das zu erreichen, was Sie erwarten, gehen Sie wie folgt vor:
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"); }
Der einfachste Weg ist die Verwendung von indexOf . Um einfach die string
für den Teilstring substr
zu überprüfen, können Sie diese Methode verwenden:
string = "asdf"; substr = "as"; alert(string.indexOf(substr) == -1 ? false : true);
Wenn Sie die Funktion string.contains()
benötigen, können Sie sie wie folgt selbst implementieren:
String.prototype.contains = function(test) { return this.indexOf(test) == -1 ? false : true; };
Jetzt können Sie diese kürzere Methode verwenden, um zu prüfen, ob eine Zeichenfolge eine spezielle Teilzeichenfolge enthält:
string = "asdf"; alert(string.contains("as"));
Hier ist das JSFiddle .
- 1
- 2
Weitere Fragen zu Javascript- Tags: Zeichenfolge Teilzeichenfolge enthält Zeichenfolge oder eine Frage stellen