регулярні вирази селектора jQuery


580

Я після документації щодо використання символів підстановки або регулярних виразів (не впевнений у точній термінології) із селектором jQuery.

Я сам це шукав, але не зміг знайти інформацію про синтаксис і як ним користуватися. Хтось знає, де знаходиться документація для синтаксису?

EDIT: Фільтри атрибутів дозволяють вибирати на основі шаблонів значення атрибута.

Відповіді:


339

Джеймс Падолсі створив чудовий фільтр, який дозволяє використовувати регулярний гекс для вибору.

Скажіть, у вас є таке div:

<div class="asdf">

Фільтр Падолсі :regexможе вибрати його так:

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

Також перевірте офіційну документацію на селектори .


3
Добре. Я був там, але я не знав назви того, що шукав. У мене був інший вигляд і використання фільтрів атрибутів - це те, що я був після.
Джоель Каннінгем

Селектор регулярних виразів від @padolsey чудово працює. Ось приклад, коли ви можете перебирати текстові, файлові і поля вхідних полів або текстові області з ним: $ j ('введення: регулярний вираз (тип, текст | файл | прапорець), текстовий пояс'). Кожне (функція (індекс) {// ...});
Метт Сеттер

13
Відповідь від nickf повинна бути прийнятою. Якщо ви читаєте цю відповідь, не забудьте прочитати цю!
Квентін Скусен

5
Я отримую Помилка: Помилка синтаксису, нерозпізнаний вираз: непідтримуваний псевдо: regex
ryan2johnson9

2
-1. Код для його реалізації не входить у відповідь і є чутливим до посилання гниття. Крім того, я знайшов дві помилки у час тестування коду - він буде падати коми з регулярних виразів , що містять їх (які вирішуються шляхом заміни matchParams.join('')з matchParams.join(',')), і будь-який шаблон , який відповідає 'undefined'або 'null'буде відповідати undefinedі null, відповідно. Цю другу помилку можна вирішити, перевіривши тестоване значення !== undefinedта !== nullперше. Так чи інакше, передати функцію у .filter()мене простіше, і я відчуваю себе більш чистим / читабельним.
Джеймс Т

732

Ви можете скористатися filterфункцією, щоб застосувати більш складне зіставлення регулярних виразів.

Ось приклад, який би просто відповідав першим трьом дівам:

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


як використовувати змінні в місці збігу (/ abc + d /); ?
Сасі варна кумар

2
@Sasivarnakumar відповідь на це питання знаходиться тут
Феліпе Майя

283

Вони можуть бути корисними.

Якщо ви знайдете компанію Contains, то буде так

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

Якщо ви знайдете за Starts With, то буде так

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

Якщо ви знайдете за Закінчується з», то це буде так

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

Якщо ви хочете вибрати елементи, які ідентифікатор яких не є заданим рядком

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

Якщо ви хочете вибрати елементи, які ім'я містить задане слово, розділене пробілами

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

Якщо ви хочете вибрати елементи, ідентифікатор яких дорівнює заданій рядку, або починаючи з цього рядка, а потім дефісом

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

3
Чудова відповідь, але ids, будучи ідентифікаторами, не може містити пробілу , ~=приклад повинен бути змінений на щось інше, наприклад class, що є списком ідентифікаторів, обмеженим пробілом. Такі речі , як classце те , що ~=селектор атрибуту був призначений.
Марний код

49

Якщо використання регулярного вираження обмежене тестуванням, якщо атрибут починається з певного рядка, ви можете використовувати ^ селектор JQuery.

Наприклад, якщо ви хочете вибрати лише div з id, що починається з "abc", ви можете використовувати:

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

Тут можна знайти дуже багато корисних селекторів для уникнення використання регулярних виразів: http://api.jquery.com/category/selectors/attribute-selectors/


це не працюватиме відповідно до вимог, що не відповідають чутливості регістру. Функція .filter краще відповідає цим потребам.
brainondev

2
це було добре для мене, я просто хотів дізнатися, чи є "__destroy" на кінці вхідного ідентифікатора, тому я використовував *=так:$("input[id*='__destroy'][value='true']")
ryan2johnson9


8

Додайте функцію 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);

Тоді,

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

вибере всі елементи прольоту з текстовими відповідями / Надіслано /.

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

вибере всі елементи інтервалу відповідно до класів /tooltip.year/.




2

Я просто даю приклад у реальному часі:

У рідному javascript я використав наступний фрагмент, щоб знайти елементи з ідентифікаторами, починаючи з "select2-qownerName_select-result".

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

Коли ми перейшли від javascript до jQuery, ми замінили вищевикладений фрагмент наступним, що передбачає менші зміни коду, не порушуючи логіку.

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


Єдиний варіант, який я знайшов без jQuery, і найефективніший. Дякую!
ggonmar

1

Якщо ви просто хочете вибрати елементи, що містять заданий рядок, ви можете використовувати наступний селектор:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.