كيف يمكنني إجراء تطابق جافا سكريبت بنمط يعتمد على متغير؟

StackOverflow https://stackoverflow.com/questions/798662

سؤال

التنفيذ الحالي لل Remy Sharp's JQuery Tag Plockion Plugin يتحقق فقط للمباريات في بداية العلامة. على سبيل المثال، لن يقوم كتابة "Photoshop" بإرجاع علامة باسم "Adobe Photoshop".

بشكل افتراضي، يكون البحث حساسا لحالة الأحرف. لقد قمت بتعديلها قليلا لتقليم المساحات الزائدة وتجاهل الحالة:

for (i = 0; i < tagsToSearch.length; i++) {
    if (tagsToSearch[i].toLowerCase().indexOf(jQuery.trim(currentTag.tag.toLowerCase())) === 0) {
        matches.push(tagsToSearch[i]);
    }
}

ما حاولت القيام به هو تعديل هذا مرة أخرى لتتمكن من إرجاع "Adobe Photoshop" عند أنواع المستخدمين في "Photoshop". لقد حاولت استخدام match, ، لكنني لا أستطيع أن أحصل عليه للعمل عندما يكون المتغير موجودا في النموذج:

for (i = 0; i < tagsToSearch.length; i++) {
    var ctag = jQuery.trim(currentTag.tag);
    if (tagsToSearch[i].match("/" + ctag + "/i")) { // this never matches, presumably because of the variable 'ctag'
        matches.push(tagsToSearch[i]);
    }
}

ما هو بناء الجملة الصحيح لأداء البحث Regex بهذه الطريقة؟

هل كانت مفيدة؟

المحلول

إذا كنت ترغب في القيام Regex ديناميكيا في جافا سكريبت، فعليك استخدام regexp كائن. وبعد أعتقد أن الكود الخاص بك سيبدو أن هذا (لم يتم اختباره، لست متأكدا، لكن الفكرة العامة الصحيحة):

for (i = 0; i < tagsToSearch.length; i++) {
    var ctag = jQuery.trim(currentTag.tag);
    var regex = new RegExp(ctag, "i")
    if (tagsToSearch[i].match(regex)) {
        matches.push(tagsToSearch[i]);
    }
}

نصائح أخرى

بدلا من

"/" + ctag + "/i"

يستخدم

new RegExp(ctag, "i")

يمكنك أيضا الاستمرار في استخدام IndexOf، ما عليك سوى تغيير === 0 إلى> = 0:

for (i = 0; i < tagsToSearch.length; i++) {
    if (tagsToSearch[i].toLowerCase().indexOf(jQuery.trim(currentTag.tag.toLowerCase())) >= 0) {
        matches.push(tagsToSearch[i]);
    }
}

ولكن مرة أخرى، قد أكون مخطئا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top