Bộ chọn biểu thức chính quy của jQuery


580

Tôi sau tài liệu về việc sử dụng ký tự đại diện hoặc các biểu thức chính quy (không chắc chắn về thuật ngữ chính xác) với bộ chọn jQuery.

Tôi đã tự tìm kiếm cái này nhưng không thể tìm thấy thông tin về cú pháp và cách sử dụng nó. Có ai biết tài liệu cho cú pháp ở đâu không?

EDIT: Bộ lọc thuộc tính cho phép bạn chọn dựa trên các mẫu của một giá trị thuộc tính.

Câu trả lời:


340

James Padolsey đã tạo ra một bộ lọc tuyệt vời cho phép regex được sử dụng để lựa chọn.

Nói rằng bạn có những điều sau đây div:

<div class="asdf">

:regexBộ lọc của Padolsey có thể chọn nó như vậy:

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

Ngoài ra, kiểm tra các tài liệu chính thức về bộ chọn .


3
Đồng ý. Tôi đã ở đó nhưng tôi không thực sự biết tên của những gì tôi đang tìm kiếm. Ive đã có một cái nhìn khác và sử dụng các bộ lọc thuộc tính là những gì tôi đã theo sau.
Joel Cickyham

Bộ chọn regex của @padolsey hoạt động rất tốt. Dưới đây là một ví dụ nơi bạn có thể lặp qua các trường nhập văn bản, tệp và hộp kiểm hoặc văn bản với nó: $ j ('input: regex (type, text | file | hộp kiểm), textarea'). Mỗi (hàm (index) {// ...});
Matt Setter

13
Câu trả lời dưới đây từ nickf nên được chấp nhận. Nếu bạn đang đọc câu trả lời này, hãy chắc chắn đọc câu trả lời đó!
Quentin Skousen

5
Tôi đang gặp Lỗi: Lỗi cú pháp, biểu thức không được nhận dạng: giả không được hỗ trợ: regex
ryan2johnson9

2
-1. Mã để thực hiện điều này không được bao gồm trong câu trả lời và dễ bị thối liên kết. Ngoài ra, tôi thấy hai lỗi trong khi thử nghiệm mã - nó sẽ thả dấu phẩy từ biểu thức thông thường chứa chúng (giải quyết bằng cách thay thế matchParams.join('')bằng matchParams.join(',')), và bất kỳ mô hình mà các trận đấu 'undefined'hay 'null'sẽ phù hợp undefinednulltương ứng. Lỗi thứ hai này có thể được giải quyết bằng cách kiểm tra giá trị được kiểm tra !== undefined!== nullđầu tiên. Dù bằng cách nào, việc chuyển một chức năng vào .filter()dễ dàng hơn và cảm thấy sạch sẽ / dễ đọc hơn đối với tôi.
James T

732

Bạn có thể sử dụng filterchức năng để áp dụng kết hợp regex phức tạp hơn.

Đây là một ví dụ phù hợp với ba div đầu tiên:

$('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>


cách sử dụng các biến ở vị trí khớp (/ abc + d /); ?
Sasi varna kumar

2
@Sasivarnakumar câu trả lời cho câu hỏi này có ở đây
Felipe Maia

283

Đây có thể là hữu ích.

Nếu bạn đang tìm kiếm bởi Chứa thì nó sẽ như thế này

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

Nếu bạn đang tìm kiếm bằng Bắt đầu với thì nó sẽ như thế này

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

Nếu bạn đang tìm kiếm bằng Ends With thì nó sẽ như thế này

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

Nếu bạn muốn chọn các phần tử mà id không phải là một chuỗi đã cho

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

Nếu bạn muốn chọn các thành phần mà tên chứa một từ nhất định, được phân cách bằng dấu cách

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

Nếu bạn muốn chọn các phần tử mà id bằng một chuỗi đã cho hoặc bắt đầu bằng chuỗi đó theo sau là dấu gạch nối

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

3
Câu trả lời tuyệt vời, nhưng ids, là định danh, không thể chứa một khoảng trắng , ~=ví dụ nên được thay đổi thành một thứ khác, như class, đó là một danh sách các định danh được phân tách bằng khoảng trắng. Những thứ như classlà những gì ~=bộ chọn thuộc tính được dự định.
Mã vô dụng

49

Nếu việc sử dụng biểu thức chính quy của bạn bị giới hạn để kiểm tra nếu một thuộc tính bắt đầu bằng một chuỗi nhất định, bạn có thể sử dụng ^bộ chọn JQuery.

Ví dụ: nếu bạn muốn chỉ chọn div có id bắt đầu bằng "abc", bạn có thể sử dụng:

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

Rất nhiều công cụ chọn rất hữu ích để tránh sử dụng regex có thể tìm thấy ở đây: http://api.jquery.com/carget/selector/attribution-selector/


điều này sẽ không làm việc cho các trường hợp phù hợp với yêu cầu không nhạy cảm. Hàm .filter phù hợp hơn với những nhu cầu đó.
brainondev

2
điều này tốt cho tôi, tôi chỉ muốn xem liệu có '__destroy' ở cuối id đầu vào hay không nên tôi đã sử dụng *=như thế này:$("input[id*='__destroy'][value='true']")
ryan2johnson9


8

Thêm một hàm 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);

Sau đó,

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

sẽ chọn tất cả các thành phần span với kết quả khớp văn bản / Đã gửi /.

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

sẽ chọn tất cả các phần tử span với các lớp của chúng khớp với /tooltip.year/.




2

Tôi chỉ đưa ra ví dụ thời gian thực của mình:

Trong javascript gốc, tôi đã sử dụng đoạn mã sau để tìm các phần tử có id bắt đầu bằng "select2-qownerName_select-result".

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

Khi chúng tôi chuyển từ javascript sang jQuery, chúng tôi đã thay thế đoạn mã trên bằng đoạn sau liên quan đến việc thay đổi mã ít hơn mà không làm phiền logic.

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


Chỉ có tùy chọn tôi tìm thấy mà không có jQuery và hiệu quả nhất. Cảm ơn bạn!
ggonmar

1

Nếu bạn chỉ muốn chọn các phần tử có chứa chuỗi đã cho thì bạn có thể sử dụng bộ chọn sau:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.