jQuery pemilih reguler ekspresi

580

Saya setelah dokumentasi tentang penggunaan wildcard atau ekspresi reguler (tidak yakin tentang terminologi yang tepat) dengan pemilih jQuery.

Saya telah mencari ini sendiri tetapi tidak dapat menemukan informasi tentang sintaks dan cara menggunakannya. Adakah yang tahu di mana dokumentasi untuk sintaks?

EDIT: Filter atribut memungkinkan Anda untuk memilih berdasarkan pola nilai atribut.

Joel Cunningham
sumber

Jawaban:

340

James Padolsey menciptakan filter luar biasa yang memungkinkan regex digunakan untuk seleksi.

Katakanlah Anda memiliki yang berikut ini div:

<div class="asdf">

Filter Padolsey :regexdapat memilihnya seperti ini:

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

Juga, periksa dokumentasi resmi tentang penyeleksi .

Xenph Yan
sumber
3
Baik. Saya pernah ke sana tetapi saya tidak benar-benar tahu nama apa yang saya cari. Ive memiliki tampilan lain dan menggunakan filter atribut adalah apa yang saya kejar.
Joel Cunningham
Selektor regex oleh @padolsey bekerja dengan sangat baik. Berikut ini adalah contoh di mana Anda dapat mengulangi bidang input teks, file dan kotak centang atau textareas dengan itu: $ j ('input: regex (jenis, teks | file | kotak centang), textarea'). Masing-masing (fungsi (indeks) {// ...});
Matt Setter
13
Jawaban di bawah dari nickf harus jawaban yang diterima. Jika Anda membaca jawaban ini, pastikan untuk membaca yang itu!
Quentin Skousen
5
Saya mendapatkan Galat: Galat
sintaksis
2
-1. Kode untuk mengimplementasikan ini tidak termasuk dalam jawaban dan rentan terhadap tautan busuk. Selain itu, saya menemukan dua bug saat menguji kode - itu akan mengeluarkan koma dari ekspresi reguler yang mengandung mereka (diselesaikan dengan mengganti matchParams.join('')dengan matchParams.join(',')), dan setiap pola yang cocok 'undefined'atau 'null'akan cocok undefineddan null, masing-masing. Bug kedua ini dapat diatasi dengan memeriksa nilai yang diuji !== undefineddan yang !== nullpertama. Either way, melewati fungsi menjadi .filter()lebih mudah dan terasa lebih bersih / lebih mudah dibaca bagi saya.
James T
732

Anda dapat menggunakan filterfungsi ini untuk menerapkan pencocokan regex yang lebih rumit.

Berikut adalah contoh yang hanya cocok dengan tiga div pertama:

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

nickf
sumber
cara menggunakan variabel di tempat yang cocok (/ abc + d /); ?
Sasi varna kumar
2
@Sasivarnakumar jawaban untuk pertanyaan ini ada di sini
Felipe Maia
283

Ini bisa membantu.

Jika Anda menemukan oleh Contains maka akan menjadi seperti ini

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

Jika Anda menemukan dengan Mulai Dengan maka itu akan menjadi seperti ini

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

Jika Anda menemukan oleh Berakhir dengan maka itu akan menjadi seperti ini

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

Jika Anda ingin memilih elemen yang bukan merupakan string yang diberikan

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

Jika Anda ingin memilih elemen yang namanya berisi kata yang diberikan, dibatasi oleh spasi

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

Jika Anda ingin memilih elemen yang idnya sama dengan string yang diberikan atau dimulai dengan string yang diikuti oleh tanda hubung

     $("input[id|='DiscountType']").each(function (i, el) {
         //It'll be an array of elements
     });
dnxit
sumber
3
Jawaban yang bagus, tetapi ids, sebagai pengidentifikasi, tidak dapat berisi spasi , ~=contohnya harus diubah menjadi sesuatu yang lain, seperti class, yang merupakan daftar pengidentifikasi terbatas ruang-putih. Hal-hal seperti classitulah yang ~=dimaksudkan untuk pemilih atribut.
Kode Tidak Berguna
49

Jika penggunaan ekspresi reguler Anda terbatas untuk menguji apakah atribut mulai dengan string tertentu, Anda bisa menggunakan ^pemilih JQuery.

Misalnya jika Anda hanya ingin memilih div dengan id yang dimulai dengan "abc", Anda dapat menggunakan:

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

Banyak penyeleksi yang sangat berguna untuk menghindari penggunaan regex dapat ditemukan di sini: http://api.jquery.com/category/selectors/attribute-selectors/

Nicolas Janel
sumber
ini tidak akan berfungsi untuk persyaratan kecocokan huruf besar-kecil. Fungsi .filter lebih sesuai dengan kebutuhan tersebut.
brainondev
2
ini bagus untuk saya, saya hanya ingin melihat apakah ada '__destroy' di akhir input id jadi saya gunakan *=seperti ini:$("input[id*='__destroy'][value='true']")
ryan2johnson9
22
var test = $('#id').attr('value').match(/[^a-z0-9 ]+/);

Ini dia!

Kamil Dąbrowski
sumber
8

Tambahkan fungsi 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);

Kemudian,

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

akan memilih semua elemen rentang dengan teks yang cocok / Terkirim /.

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

akan memilih semua elemen rentang dengan kelas yang sesuai /tooltip.year/.

sungai hong
sumber
2
$("input[name='option[colour]'] :checked ")
irfan akhtar
sumber
2

Saya hanya memberikan contoh waktu nyata saya:

Dalam javascript asli saya menggunakan cuplikan berikut untuk menemukan elemen dengan id dimulai dengan "select2-qownerName_select-result".

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

Ketika kami beralih dari javascript ke jQuery, kami telah mengganti cuplikan di atas dengan yang berikut yang melibatkan lebih sedikit perubahan kode tanpa mengganggu logika.

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

Wisnu Prasanth G
sumber
Hanya opsi yang saya temukan tanpa jQuery, dan yang paling efisien. Terima kasih!
ggonmar
1

Jika Anda hanya ingin memilih elemen yang berisi string yang diberikan maka Anda dapat menggunakan pemilih berikut:

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

Prakash GPz
sumber