Espressioni regolari del selettore jQuery


580

Sto cercando la documentazione sull'uso di caratteri jolly o espressioni regolari (non sono sicuro della terminologia esatta) con un selettore jQuery.

L'ho cercato da solo, ma non sono stato in grado di trovare informazioni sulla sintassi e su come usarla. Qualcuno sa dove si trova la documentazione per la sintassi?

EDIT: i filtri degli attributi ti consentono di selezionare in base ai modelli di un valore di attributo.

Risposte:


340

James Padolsey ha creato un meraviglioso filtro che consente di utilizzare regex per la selezione.

Di 'che hai il seguente div:

<div class="asdf">

Il :regexfiltro di Padolsey può selezionarlo in questo modo:

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

Inoltre, controlla la documentazione ufficiale sui selettori .


3
Ok. Ci sono stato ma non sapevo davvero il nome di quello che stavo cercando. Ho avuto un altro aspetto e usando i filtri degli attributi è quello che stavo cercando.
Joel Cunningham,

Il selettore regex di @padolsey funziona alla grande. Ecco un esempio in cui è possibile scorrere i campi di input di testo, file e checkbox o textareas con esso: $ j ('input: regex (type, text | file | checkbox), textarea'). Each (function (index) {// ...});
Matt Setter,

13
La risposta qui sotto da nickf dovrebbe essere quella accettata. Se stai leggendo questa risposta, assicurati di leggerla!
Quentin Skousen,

5
Ricevo Errore: errore di sintassi, espressione non riconosciuta: pseudo non supportato: regex
ryan2johnson9

2
-1. Il codice per implementarlo non è incluso nella risposta ed è suscettibile al marciume dei link. Inoltre, ho trovato due bug durante il test del codice: eliminerà le virgole dalle espressioni regolari che li contengono (risolto sostituendo matchParams.join('')con matchParams.join(',')) e qualsiasi modello che corrisponda 'undefined'o 'null'corrisponderà undefinede null, rispettivamente. Questo secondo problema può essere risolto controllando che il valore testato !== undefinede !== nullprima. In ogni caso, passare una funzione in .filter()è più facile e mi sembra più pulito / più leggibile.
James T

732

È possibile utilizzare la filterfunzione per applicare una corrispondenza regex più complicata.

Ecco un esempio che corrisponderebbe ai primi tre 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>


come usare le variabili al posto della corrispondenza (/ abc + d /); ?
Sasi varna kumar,

2
@Sasivarnakumar la risposta a questa domanda è qui
Felipe Maia,

283

Questi possono essere utili.

Se lo trovi da Contains , sarà così

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

Se lo stai scoprendo da Starts With , sarà così

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

Se lo stai trovando con Ends With , sarà così

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

Se si desidera selezionare elementi quale ID non è una determinata stringa

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

Se si desidera selezionare elementi il ​​cui nome contiene una determinata parola, delimitato da spazi

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

Se si desidera selezionare elementi quale id è uguale a una determinata stringa o iniziare con quella stringa seguita da un trattino

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

3
Una grande risposta, ma ids, essendo identificatori, non può contenere uno spazio , l' ~=esempio dovrebbe essere cambiato in qualcos'altro, come class, che è un elenco di identificatori delimitato da spazi bianchi. Cose come classsono ~=state progettate per il selettore di attributi.
Codice inutile

49

Se l'uso dell'espressione regolare è limitato per verificare se un attributo inizia con una determinata stringa, è possibile utilizzare il ^selettore JQuery.

Ad esempio, se si desidera selezionare solo div con id che inizia con "abc", è possibile utilizzare:

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

Molti selettori molto utili per evitare l'uso di regex possono essere trovati qui: http://api.jquery.com/category/selectors/attribute-selectors/


questo non funzionerà per requisiti di corrispondenza senza distinzione tra maiuscole e minuscole. La funzione .filter si adatta meglio a queste esigenze.
brainondev,

2
questo è stato buono per me, volevo solo vedere se c'era un '__destroy' alla fine di un ID di input, quindi ho usato *=così:$("input[id*='__destroy'][value='true']")
ryan2johnson9


8

Aggiungi una funzione 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);

Poi,

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

selezionerà tutti gli elementi di span con corrispondenze di testo / Sent /.

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

selezionerà tutti gli elementi di span con le loro classi corrispondenti a /tooltip.year/.




2

Sto solo dando il mio esempio in tempo reale:

Nel javascript nativo ho usato il seguente frammento per trovare gli elementi con ID che inizia con "select2-qownerName_select-result".

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

Quando siamo passati da javascript a jQuery abbiamo sostituito lo snippet sopra con il seguente che comporta meno modifiche al codice senza disturbare la logica.

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


L'unica opzione che ho trovato senza jQuery e quella più efficiente. Grazie!
ggonmar,

1

Se vuoi solo selezionare elementi che contengono una determinata stringa, puoi usare il seguente selettore:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.