jQuery selector นิพจน์ทั่วไป


580

ฉันหลังจากใช้เอกสารในการใช้ไวด์การ์ดหรือนิพจน์ปกติ (ไม่แน่ใจในคำศัพท์ที่แน่นอน) ด้วยตัวเลือก jQuery

ฉันค้นหาด้วยตัวเอง แต่ไม่สามารถค้นหาข้อมูลเกี่ยวกับไวยากรณ์และวิธีใช้งานได้ ไม่มีใครทราบว่าเอกสารสำหรับไวยากรณ์อยู่ที่ไหน

แก้ไข: ตัวกรองคุณลักษณะช่วยให้คุณเลือกตามรูปแบบของค่าคุณลักษณะ

คำตอบ:


339

James Padolsey สร้างตัวกรองที่ยอดเยี่ยมที่อนุญาตให้ใช้ regex สำหรับการเลือก

สมมติว่าคุณมีดังต่อไปนี้div:

<div class="asdf">

:regexตัวกรองของ Padolsey สามารถเลือกได้ดังนี้:

$("div:regex(class, .*sd.*)")

นอกจากนี้ยังตรวจสอบเอกสารอย่างเป็นทางการในตัวเลือก


3
ตกลง. ฉันเคยไปที่นั่น แต่ฉันไม่รู้ชื่อของสิ่งที่ฉันกำลังมองหา ฉันมีรูปลักษณ์และการใช้ฟิลเตอร์คุณลักษณะอื่นคือสิ่งที่ฉันเป็นหลังจากนั้น
Joel Cunningham

ตัวเลือก regex โดย @padolsey ใช้งานได้ดี นี่คือตัวอย่างที่คุณสามารถวนซ้ำข้อความฟิลด์และช่องทำเครื่องหมายอินพุตหรือ textareas ด้วย: $ j ('อินพุต: regex (ประเภท, ข้อความ | ไฟล์ | ช่องทำเครื่องหมาย), textarea') แต่ละรายการ (ดัชนี) {// ... });
Matt Setter

13
คำตอบด้านล่างจาก nickf ควรเป็นคำตอบที่ยอมรับได้ หากคุณกำลังอ่านคำตอบนี้ให้แน่ใจว่าได้อ่านคำตอบนั้น!
Quentin Skousen

5
ฉันได้รับข้อผิดพลาด: ข้อผิดพลาดทางไวยากรณ์, การแสดงออกที่ไม่รู้จัก: หลอกไม่สนับสนุน: regex
ryan2johnson9

2
-1 รหัสที่จะนำมาใช้นี้ไม่รวมอยู่ในคำตอบและเป็นที่ไวต่อการเชื่อมโยงเน่า นอกจากนี้ฉันพบข้อบกพร่องสองข้อในขณะที่ทดสอบรหัส - มันจะลบเครื่องหมายจุลภาคจากนิพจน์ทั่วไปที่มีพวกเขา (แก้ไขโดยแทนที่matchParams.join('')ด้วยmatchParams.join(',')) และรูปแบบใด ๆ ที่ตรงกับ'undefined'หรือ'null'จะจับคู่undefinedและnullตามลำดับ ข้อผิดพลาดที่สองนี้สามารถแก้ไขได้โดยการตรวจสอบว่าค่าที่ทดสอบ!== undefinedและ!== nullครั้งแรก ไม่ว่าจะด้วยวิธีใดการผ่านฟังก์ชั่นเข้ามา.filter()นั้นง่ายขึ้นและรู้สึกว่าฉัน / อ่านง่ายขึ้น
James T

732

คุณสามารถใช้filterฟังก์ชันเพื่อใช้การจับคู่ regex ที่ซับซ้อนมากขึ้น

นี่คือตัวอย่างที่เพิ่งจะจับคู่สาม divs แรก:

$('div')
  .filter(function() {
    return this.id.match(/abc+d/);
  })
  .html("Matched!");
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="abcd">Not matched</div>
<div id="abccd">Not matched</div>
<div id="abcccd">Not matched</div>
<div id="abd">Not matched</div>


วิธีใช้ตัวแปรในตำแหน่งของการจับคู่ (/ abc + d /); ?
Sasi varna kumar

2
@Sasivarnakumar คำตอบสำหรับคำถามนี้อยู่ที่นี่
Felipe Maia

283

สิ่งเหล่านี้มีประโยชน์

หากคุณกำลังหาโดยมีแล้วมันจะเป็นอย่างนี้

    $("input[id*='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

หากคุณกำลังค้นหาด้วยStarts Withก็จะเป็นเช่นนี้

    $("input[id^='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

หากคุณกำลังค้นหาด้วยEnds Withก็จะเป็นเช่นนี้

     $("input[id$='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

หากคุณต้องการเลือกองค์ประกอบที่id ไม่ใช่สตริงที่กำหนด

    $("input[id!='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

หากคุณต้องการเลือกองค์ประกอบที่ชื่อมีคำที่กำหนดคั่นด้วยช่องว่าง

     $("input[name~='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

หากคุณต้องการเลือกองค์ประกอบที่id เท่ากับสตริงที่กำหนดหรือเริ่มต้นด้วยสตริงนั้นตามด้วยยัติภังค์

     $("input[id|='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });

3
คำตอบที่ดี แต่ids เป็นตัวระบุไม่สามารถมีช่องว่างที่~=ตัวอย่างเช่นควรจะเปลี่ยนเป็นอย่างอื่นเช่นclassซึ่งเป็นพื้นที่สีขาวคั่นรายการของตัวระบุ สิ่งที่ต้องการclassคือสิ่งที่~=ตัวเลือกคุณลักษณะมีไว้สำหรับ
รหัสที่ไร้ประโยชน์

49

หากการใช้นิพจน์ทั่วไปของคุณถูก จำกัด เพื่อทดสอบว่าการเริ่มต้นที่เกี่ยวข้องกับสตริงที่แน่นอนคุณสามารถใช้^ตัวเลือก JQuery

ตัวอย่างเช่นหากคุณต้องการเลือก div ด้วยรหัสที่ขึ้นต้นด้วย "abc" เท่านั้นคุณสามารถใช้:

$("div[id^='abc']")

มีตัวเลือกที่มีประโยชน์มากมายที่จะหลีกเลี่ยงการใช้ regex ได้ที่นี่: http://api.jquery.com/category/selectors/attribute-selectors/


สิ่งนี้จะไม่ทำงานสำหรับข้อกำหนดการจับคู่แบบไม่สนใจตัวพิมพ์ ฟังก์ชั่น. ฟิลเตอร์ที่เหมาะกับความต้องการเหล่านั้นมากขึ้น
brainondev

2
นี่เป็นสิ่งที่ดีสำหรับฉันฉันแค่อยากจะดูว่ามี '__destroy' ที่ส่วนท้ายของรหัสอินพุตดังนั้นฉันจึงใช้*=สิ่งนี้:$("input[id*='__destroy'][value='true']")
ryan2johnson9


8

เพิ่มฟังก์ชั่น jQuery

(function($){
    $.fn.regex = function(pattern, fn, fn_a){
        var fn = fn || $.fn.text;
        return this.filter(function() {
            return pattern.test(fn.apply($(this), fn_a));
        });
    };
})(jQuery);

จากนั้น

$('span').regex(/Sent/)

จะเลือกองค์ประกอบการขยายทั้งหมดที่มีการจับคู่ข้อความ / ส่ง /

$('span').regex(/tooltip.year/, $.fn.attr, ['class'])

จะเลือกองค์ประกอบการขยายทั้งหมดที่มีคลาสตรงกับ /tooltip.year/




2

ฉันแค่ยกตัวอย่างตามเวลาจริง:

ในจาวาสคริปต์ดั้งเดิมฉันใช้ตัวอย่างต่อไปนี้เพื่อค้นหาองค์ประกอบที่มีรหัสเริ่มต้นด้วย "select2-qownerName_select-result"

document.querySelectorAll("[id^='select2-qownerName_select-result']");

เมื่อเราเปลี่ยนจาก javascript เป็น jQuery เราได้แทนที่ส่วนย่อยด้วยตัวอย่างต่อไปนี้ซึ่งเกี่ยวข้องกับการเปลี่ยนแปลงรหัสน้อยโดยไม่รบกวนตรรกะ

$("[id^='select2-qownerName_select-result']")


ตัวเลือกเดียวที่ฉันค้นพบโดยไม่มี jQuery และตัวเลือกที่มีประสิทธิภาพมากที่สุด ขอบคุณ!
ggonmar

1

หากคุณต้องการเลือกองค์ประกอบที่มีสตริงที่กำหนดคุณสามารถใช้ตัวเลือกต่อไปนี้:

$(':contains("search string")')

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.