Wyrażenia regularne selektora jQuery

580

Jestem po dokumentacji dotyczącej używania symboli wieloznacznych lub wyrażeń regularnych (nie jestem pewien co do dokładnej terminologii) za pomocą selektora jQuery.

Szukałem tego sam, ale nie byłem w stanie znaleźć informacji na temat składni i sposobu jej użycia. Czy ktoś wie, gdzie jest dokumentacja składni?

EDYCJA: Filtry atrybutów pozwalają wybrać na podstawie wzorców wartości atrybutu.

Joel Cunningham
źródło

Odpowiedzi:

339

James Padolsey stworzył wspaniały filtr, który pozwala na wybór wyrażenia regularnego.

Powiedz, że masz następujące elementy div:

<div class="asdf">

:regexFiltr Padolsey może wybrać go w następujący sposób:

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

Sprawdź także oficjalną dokumentację dotyczącą selektorów .

Xenph Yan
źródło
3
Ok. Byłem tam, ale tak naprawdę nie znałem nazwy tego, czego szukałem. Miałem inny wygląd i po to właśnie szukałem filtrów atrybutów.
Joel Cunningham
Selektor wyrażeń regularnych autorstwa @padolsey działa świetnie. Oto przykład, w którym można iterować po nim pola tekstowe, plikowe i pola wyboru lub obszary tekstowe: $ j ('input: regex (type, text | file | checkbox), textarea'). Each (function (index) {// ...});
Matt Setter
13
Poniższa odpowiedź od nickf powinna być zaakceptowana. Jeśli czytasz tę odpowiedź, koniecznie ją przeczytaj!
Quentin Skousen
5
Otrzymuję błąd: błąd składni, nierozpoznane wyrażenie: nieobsługiwane pseudo: regex
ryan2johnson9
2
-1. Kod do implementacji tego nie jest uwzględniony w odpowiedzi i jest podatny na gnicie linków. Ponadto podczas testowania kodu znalazłem dwa błędy - spowoduje to usunięcie przecinków z zawierających je wyrażeń regularnych (rozwiązanych przez zastąpienie matchParams.join('')je matchParams.join(',')) oraz każdego wzorca, który pasuje 'undefined'lub 'null'będzie pasował undefinedi nullodpowiednio. Ten drugi błąd można rozwiązać, sprawdzając, czy przetestowana wartość !== undefinedi !== nullnajpierw. Tak czy inaczej, przekazanie funkcji .filter()jest łatwiejsze i wydaje mi się czystsze / bardziej czytelne.
James T
732

Możesz użyć tej filterfunkcji, aby zastosować bardziej skomplikowane dopasowanie wyrażenia regularnego.

Oto przykład, który pasowałby do pierwszych trzech div:

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

pseudonim
źródło
jak używać zmiennych w miejscu dopasowania (/ abc + d /); ?
Sasi varna kumar
2
@Sasivarnakumar odpowiedź na to pytanie jest tutaj
Felipe Maia
283

Mogą być pomocne.

Jeśli znajdziesz w Contains , będzie tak

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

Jeśli znajdziesz, zaczyna się od, będzie tak

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

Jeśli znajdziesz w Ends With , będzie tak

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

Jeśli chcesz wybrać elementy, których identyfikator nie jest podanym ciągiem

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

Jeśli chcesz wybrać elementy, których nazwa zawiera dane słowo, rozdzielone spacjami

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

Jeśli chcesz wybrać elementy, których identyfikator jest równy podanemu ciągowi lub zaczynając od tego ciągu, po którym następuje myślnik

     $("input[id|='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });
dnxit
źródło
3
Świetna odpowiedź, ale idponieważ jako identyfikatory nie mogą zawierać spacji , ~=przykład należy zmienić na coś innego, na przykład classlistę rozdzielaną spacjami. Takie class~=cele selektora atrybutów.
Bezużyteczny kod
49

Jeśli użycie wyrażenia regularnego jest ograniczone do sprawdzenia, czy atrybut zaczyna się od określonego ciągu, można użyć ^selektora JQuery.

Na przykład, jeśli chcesz wybrać div z identyfikatorem zaczynającym się na „abc”, możesz użyć:

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

Wiele bardzo przydatnych selektorów pozwalających uniknąć użycia wyrażenia regularnego można znaleźć tutaj: http://api.jquery.com/category/selectors/attribute-selectors/

Nicolas Janel
źródło
nie zadziała to w przypadku wymagań dotyczących rozróżniania wielkości liter. Funkcja .filter lepiej odpowiada tym potrzebom.
brainondev
2
to było dla mnie dobre, chciałem tylko sprawdzić, czy na końcu identyfikatora wejściowego jest „__destroy”, więc użyłem *=tego w następujący sposób:$("input[id*='__destroy'][value='true']")
ryan2johnson9
22
var test = $('#id').attr('value').match(/[^a-z0-9 ]+/);

Proszę bardzo!

Kamil Dąbrowski
źródło
8

Dodaj funkcję 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);

Następnie,

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

wybierze wszystkie elementy zakresu z dopasowaniami tekstu / Wysłane /.

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

wybierze wszystkie elementy zakresu, aby ich klasy pasowały do ​​/tooltip.year/.

strumyk hong
źródło
2
$("input[name='option[colour]'] :checked ")
irfan akhtar
źródło
2

Podaję tylko mój przykład w czasie rzeczywistym:

W natywnym javascript użyłem następującego fragmentu, aby znaleźć elementy o identyfikatorach zaczynających się od „select2-qownerName_select-result”.

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

Kiedy przeszliśmy z javascript do jQuery, zastąpiliśmy powyższy fragment kodu poniższym, który obejmuje mniej zmian kodu bez zakłócania logiki.

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

Wisznu Prasanth G.
źródło
Jedyną opcję, którą znalazłem bez jQuery, i najbardziej wydajną. Dziękuję Ci!
ggonmar
1

Jeśli chcesz tylko wybrać elementy zawierające podany ciąg, możesz użyć następującego selektora:

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

Prakash GPz
źródło