2012-01-18 41 views
7

Tôi đang sử dụng một phần mở rộng cho jQuery "contains", hiển thị dưới đây:Regular Expressions Javascript với jQuery Có Regex mở rộng

$.extend($.expr[':'],{ 
    containsExact: function(a,i,m){ 
     return $.trim(a.innerHTML.toLowerCase()) === m[3].toLowerCase(); 
    }, 
    containsExactCase: function(a,i,m){ 
     return $.trim(a.innerHTML) === m[3]; 
    }, 
    containsRegex: function(a,i,m){ 
     var regreg = /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/, 
     reg = regreg.exec(m[3]); 
     return RegExp(reg[1], reg[2]).test($.trim(a.innerHTML)); 
    } 
}); 

Tôi có một bảng với một số tế bào mà tôi đang cố gắng để định dạng có điều kiện, vì vậy Tôi đang sử dụng phần mở rộng trong bộ chọn td, với chức năng containsRegex. Vấn đề mà tôi đang gặp phải là nhiều biểu thức thông thường mà tôi đang cố gắng sử dụng (tôi đã thử nghiệm trên các trình kiểm tra regex javascript như this và chúng đã hoạt động) không hoạt động với chức năng này. Đây là các chuỗi khác nhau mà tôi muốn đối sánh:

Lưu ý rằng "x" có thể là rìu, t, f hoặc v và "X" có thể là X, T, F hoặc V. Cuối cùng là một "(mb)" có thể là bất kỳ hai chữ cái thường az trong ngoặc đơn.

-, (mb), x *, x * (mb), x, x (mb), X *, X * (mb), X

Và đây là mã với một số câu lệnh regex mà tôi đang sử dụng:

$("td:containsExact('-')").addClass("0 queue"); // - 
$("td:containsRegex('/[^xtfv*]\([a-z]{2}\)/g')").addClass("1 active"); // (mb) 
$("td:containsRegex('/\b[xtfv]\*(?!\()/g')").addClass("2 queue review"); // x* 
$("td:containsRegex('/\b[xtfv]\*(?:\([a-z]{2}\))/g')").addClass("3 active review"); // x*(mb) 
$("td:containsRegEx('/\b[xtfv](?![*\(])/g')").addClass("4 queue"); // x 
$("td:containsRegEx('/\b[xtfv](?:\([a-z]{2}\))/g')").addClass("5 active"); // x(mb) 
$("td:containsRegEx('/\b[XTFV]\*(?!\()/g')").addClass("6 queue review"); // X* 
$("td:containsRegEx('/\b[XTFV]\*(?:\([a-z]{2}\))/g')").addClass("7 active review"); // X*(mb) 
$("td:containsRegEx('/\b[XTFV](?![*\(])/g')").addClass("8 done"); // X 

Hầu hết các lỗi này trong Chrome. Có ai có bất kỳ con trỏ? Tiện ích mở rộng có hạn chế không?

Cảm ơn trước sự giúp đỡ của bạn!

+0

Để tham khảo: lỗi nó đi là "của router Lỗi cú pháp, biểu hiện không được công nhận:)/g ')" trên "x *" và "X *". Nó áp dụng một cách thích hợp lớp vào "(mb)" nhưng cũng áp dụng cùng các lớp đó cho "x * (mb)" ... Phần còn lại của các tìm kiếm không vượt qua lỗi, nhưng chúng cũng không tìm thấy các kết quả phù hợp. – mbeasley

Trả lời

5

Ok, tôi nghĩ rằng tôi đã nhận nó ... Đây là những thay đổi mà tôi thực hiện:

  • Năm câu hỏi cuối selectors có vốn "E" và tất cả cần được "containsRegex()"
  • tôi đã thay đổi containsRegex một chút bằng cách thêm một "reg" kiểm tra trong sự trở lại, để làm cho nó mạnh mẽ hơn:

    containsRegex: function(a,i,m){ 
        var regreg = /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/, 
        reg = regreg.exec(m[3]); 
        return reg ? RegExp(reg[1], reg[2]).test($.trim(a.innerHTML)) : false; 
    } 
    
  • Tất cả thoát nhân vật trong nhu regex để được tăng gấp đôi thoát (tức là \( cần phải được \\()

  • Tôi đã gỡ bỏ tất cả các dấu nháy đơn để thực sự giúp tôi khỏi bị phân tâm

  • tôi loại bỏ các số tên lớp. Tôi biết ID không nên bắt đầu bằng những con số và tôi chắc rằng tên lớp không nên bắt đầu hay chỉ là một con số. Dù sao, điều này dẫn đến một số bộ chọn thêm cùng một regex (tức là "x" và "-" trông giống nhau, cũng như "x * (mb)" và "X * (mb)" với css trong bản trình diễn).

Dù sao, tôi sẽ cập nhật ý chính của tôi với mã này và bạn demo:

/* jQuery selector to match exact text inside an element 
* :containsExact()  - case insensitive 
* :containsExactCase() - case sensitive 
* :containsRegex()  - set by user (use: $(el).find(':containsRegex(/(red|blue|yellow)/gi)')) 
*/ 
$.extend($.expr[':'],{ 
    containsExact: function(a,i,m){ 
    return $.trim(a.innerHTML.toLowerCase()) === m[3].toLowerCase(); 
    }, 
    containsExactCase: function(a,i,m){ 
    return $.trim(a.innerHTML) === m[3]; 
    }, 
    containsRegex: function(a,i,m){ 
    var regreg = /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/, 
    reg = regreg.exec(m[3]); 
    return reg ? RegExp(reg[1], reg[2]).test($.trim(a.innerHTML)) : false; 
    } 
}); 

// -, (mb), x*, x*(mb), x, x(mb), X*, X*(mb), X 

$("td:containsRegex(/^[xtfv]$/)").addClass("queue"); // x 
$("td:containsRegex(/^[xtfv]\\*$/)").addClass("queue review"); // x* 
$("td:containsRegex(/^\\([a-z]{2}\\)$/)").addClass("active"); // (mb) 
$("td:containsRegex(/^[xtfv]\\([a-z]{2}\\)$/)").addClass("active"); // x(mb) 
$("td:containsRegex(/^[xtfv]\\*\\([a-z]{2}\\)$/)").addClass("active review"); // x*(mb) 

$("td:containsRegex(/^[XTFV]$/)").addClass("done"); // X 
$("td:containsRegex(/^[XTFV]\\*$/)").addClass("queue review"); // X* 
$("td:containsRegex(/^[XTFV]\\*\\([a-z]{2}\\)$/)").addClass("active review"); // X*(mb) 

$("td:containsExact(-)").addClass("queue"); // - 
+0

Oh người đàn ông - mà làm việc hoàn hảo. Tôi hoàn toàn bỏ qua đôi thoát, mà tôi biết rằng tôi hiểu logic đằng sau Regex so với RegEx điều là loại câm cho tôi bỏ qua, nhưng tôi vui vì bạn bắt gặp nó.Và tôi đánh giá cao những thay đổi để mở rộng 'chứa' của bạn. Đó thực sự là một đoạn mã tuyệt vời, vì vậy một lần nữa - cảm ơn bạn – mbeasley

+0

Tôi đã cập nhật [gist] (https://gist.github.com/461488) có chứa mã này để làm việc với jQuery 1.8+. của các thay đổi đối với hàm 'expr', hàm': containsRegex() 'bây giờ không yêu cầu dấu ngoặc kép bên trong dấu ngoặc đơn. – Mottie

2
"td:containsRegex('/\b[xtfv]\*(?!\()/g')" 

\b bên trong một chuỗi chữ có nghĩa là xóa lùi ("\b" === "\x08") trong khi nó có nghĩa là wordbreak trong một regex. Hãy thử thay thế tất cả các \b bằng \\b.

Bạn cũng nên thay đổi chính xác \( thành [(] kể từ trong JS, "foo\(bar\)" === "foo(bar)".

+0

Thật không may, điều duy nhất đã giúp thay thế \ (với [(] nơi nó tìm kiếm "x *" và "X *" - nhưng tất cả những gì đã làm là ngăn chặn lỗi được đề cập trong bình luận ban đầu của tôi. đó là kích hoạt là "(mb)" và không may rằng một trong những vẫn còn áp dụng kích hoạt cho "x * (mb)" là tốt ... Cảm ơn mặc dù.Tất cả các phần của xử lý sự cố này tôi giả sử – mbeasley

Các vấn đề liên quan