كيفية التحقق مما إذا كانت سلسلة تحتوي على سلسلة فرعية في JavaScript؟


Answers

يمكنك بسهولة إضافة طريقة contains على سلسلة مع هذا البيان:

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

ملاحظة: راجع التعليقات أدناه للحصول على وسيطة صالحة لعدم استخدام هذا. نصيحتي: استخدام الحكم الخاص بك.

بدلا من ذلك:

if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; }
Question

عادة ما أتوقع طريقة String.contains() ، ولكن لا يبدو أن هناك واحدة.

ما هي الطريقة المعقولة للتحقق من ذلك؟




إذا كنت تبحث عن بديل لكتابة الشيك القبيح -1 ، فأنت تقترب من التيلدا بدلاً من ذلك.

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

جو زيمرمان - سترى أن استخدام ~ في -1 يحولها إلى 0. الرقم 0 هو قيمة خادعة ، بمعنى أنه سيتم تقييمه إلى خطأ عند تحويله إلى قيمة منطقية. قد لا يبدو ذلك بمثابة إحصاء كبير في البداية ، ولكن تذكر أن الدالات مثل indexOf ستعود -1 عندما لا يتم العثور على الاستعلام. هذا يعني أنه بدلاً من كتابة شيء مشابه لهذا:

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

يمكنك الآن الحصول على عدد أقل من الأحرف في شفرتك حتى تتمكن من كتابتها كما يلي:

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

مزيد من التفاصيل هنا




الطريقة الأسهل هي استخدام indexOf بالفعل. لمجرد التحقق من سلسلة string فرعية فرعية يمكنك استخدام هذا الأسلوب:

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 للتحقق مما إذا كانت السلسلة تحتوي على سلسلة فرعية خاصة:

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

هنا JSFiddle كذلك.




شفرة جافا سكريبت لاستخدام الطريقة التي 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>

في الكود المعطى ، تحدد الطريقة التي contains ما إذا كان العنصر المحدد موجودًا في الصفيف أم لا. إذا كان العنصر المحدد موجودًا في المصفوفة ، فسوف يعرض true ، وإلا فسيرجع false.




يمكنك استخدام jQuery's :contains المحدّد.

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

التحقق من ذلك هنا: contains-selector




جافا سكريبت

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

مسج

  <p>My big string contain apples and oranges</p>
  alert($("p:contains(apples)")[0] != undefined); //will alert true if found



الطريقة الشائعة لكتابة أسلوب contains JavaScript هي:

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

يتم استخدام عامل الإبطال الخاص بـ bitwise ( ~ ) لتحويل -1 إلى 0 (falsey) ، وتكون كافة القيم الأخرى غير صفرية (truthy).

يتم استخدام عوامل نفي منطقية مزدوجة لإلقاء الرقم في منطقي.







لجمع بعض الحلول الصالحة:

var stringVariable = "some text";
var findString = "text";

//using `indexOf()`
var containResult1 = stringVariable.indexOf(findString) != -1;
document.write(containResult1+', ');

//using `lastIndexOf()`
var containResult2 = stringVariable.lastIndexOf(findString) != -1;
document.write(containResult2+', ');

//using `search()`
var containResult3 = stringVariable.search(findString) != -1;
document.write(containResult3+', ');
     
//using `split()`
var containResult4 = stringVariable.split(findString)[0] != stringVariable;
document.write(containResult4+'');




كنت تبحث عن .indexOf String.prototype.indexOf .

indexOf سيقوم بإرجاع فهرس إلى السلسلة الفرعية المتطابقة. سوف يرتبط المؤشر إلى حيث تبدأ السلسلة الفرعية. في حالة عدم وجود تطابق ، يتم إرجاع -1. هذا عرض تجريبي بسيط لهذا المفهوم:

var str = "Hello World"; // For example, lets search this string,
var term = "World"; // for the term "World",
var index = str.indexOf(term); // and get its index.
if (index != -1) { // If the index is not -1 then the term was matched in the string,
  alert(index); // and we can do some work based on that logic. (6 is alerted)
}




حل بسيط

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




خيار آخر للقيام بذلك هو:

يمكنك استخدام وظيفة المطابقة ، أي شيء من هذا القبيل:

x = "teststring";

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

يمكن أن تعمل match () أيضًا مع التعبير العادي:

x = "teststring";

if (x.match(/test/i)) {
     // Code
}



يمكنك استخدام طريقة JavaScript search() .

البناء هو: string.search(regexp)

تقوم بإرجاع موضع المطابقة أو -1 إذا لم يتم العثور على تطابق.

انظر الأمثلة هناك: jsref_search

لست بحاجة إلى صيغة تعبير عادية معقدة. إذا لم تكن على دراية بها st.search("title") بسيط. إذا كنت تريد أن يكون الاختبار الخاص بك غير حساس لحالة الأحرف ، فيجب عليك القيام بـ st.search(/title/i) .




var index = haystack.indexOf(needle);



هناك طريقة أنيق وأفضل للقيام بذلك وهو يستخدم عامل التشغيل (BitWise NOT).

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

Bitwise لا يحول "x" إلى - (x + 1) ، إذا كان x يتحول إلى -1 من أسلوب indexOf.then سيتم تحويله إلى - (-1 + 1) = -0 وهي قيمة كاذبة.