jQuery选择器正则表达式


580

我正在寻找有关通过jQuery选择器使用通配符或正则表达式(不确定确切术语)的文档。

我本人已在寻找此信息,但无法找到有关语法以及如何使用它的信息。有谁知道语法的文档在哪里?

编辑:属性过滤器使您可以基于属性值的模式进行选择。

Answers:


339

James Padolsey创建了一个很棒的过滤器,允许使用正则表达式进行选择。

说您有以下内容div

<div class="asdf">

Padolsey的:regex过滤器可以像这样选择它:

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

另外,请查阅关于选择器官方文档


3
好。我去过那里,但我真的不知道我要找的名字。香港专业教育学院有另一个外观,使用属性过滤器是我的追求。
乔尔·坎宁安

@padolsey的正则表达式选择器效果很好。这是一个示例,您可以用它遍历文本,文件和复选框输入字段或文本区域:$ j('input:regex(type,text | file | checkbox),textarea')。each(function(index){// ...});
马特·塞特

13
尼克的以下答案应该是被接受的。如果您正在阅读此答案,请务必阅读该答案!
Quentin Skousen 2014年

5
我收到错误消息:语法错误,无法识别的表达式:不支持的伪代码:regex
ryan2johnson9'1

2
-1。实现此目的的代码未包含在答案中,并且容易受到链接腐烂的影响。此外,我在测试代码时发现了两个错误-它会从包含它们的正则表达式中删除逗号(通过替换matchParams.join('')为来解决matchParams.join(',')),以及分别与'undefined''null'匹配undefined和匹配的任何模式null。第二个错误可以通过检查测试值!== undefined!== null第一个错误来解决。无论哪种方式,将函数传递到中.filter()都更容易,并且对我来说更干净/更易读。
James T

732

您可以使用该filter功能应用更复杂的正则表达式匹配。

这是一个仅与前三个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>


如何在match(/ abc + d /)位置使用变量;?
Sasi varna kumar

2
@Sasivarnakumar回答这个问题是在这里
费利佩·马亚

283

这些可能会有所帮助。

如果您是按Contains查找的,它将是这样

    $("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
     });

如果您通过Ends With找到,它将像这样

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

如果要选择id不是给定字符串的元素

    $("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
     });

如果要选择id等于给定字符串的元素,或者以该字符串开头,后跟连字符

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

3
好的答案,但id作为标识符的s 不能包含空格~=应将示例更改为其他内容,例如class,这是用空格分隔的标识符列表。诸如此类class的事情就是~=属性选择器的用途。
无用的代码

49

如果对正则表达式的使用仅限于测试属性是否以某个字符串开头,则可以使用^JQuery选择器。

例如,如果您只想选择ID以“ abc”开头的div,则可以使用:

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

可以在此处找到很多避免使用正则表达式的非常有用的选择器:http : //api.jquery.com/category/selectors/attribute-selectors/


这对于区分大小写的匹配要求不起作用。.filter函数更适合这些需求。
brainondev

2
这对我有好处,我只想查看输入id的末尾是否有'__destroy',所以我这样使用*=$("input[id*='__destroy'][value='true']")
ryan2johnson9 2015年


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/)

将选择所有文本匹配/ Sent /的span元素。

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

将选择其类匹配/tooltip.year/的所有span元素。




2

我只是给出我的实时示例:

在本机javascript中,我使用了以下代码段来查找ID以“ select2-qownerName_select-result”开头的元素。

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

当我们从javascript转移到jQuery时,我们已将以下代码段替换为以下代码段,其中涉及的代码更改更少,并且不会干扰逻辑。

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


我发现的唯一选择是没有jQuery,也是最有效的选择。谢谢!
ggonmar

1

如果只想选择包含给定字符串的元素,则可以使用以下选择器:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.