jQuery - regexp选择和removeClass()?

时间:2013-03-25 14:55:07

标签: jquery regex

我已经获得了几个数千行的自动生成的HTML文档,我需要清理源代码。大多数情况下需要删除类似“table-col - ##”的类名。这是一个两步问题:

  1. 选择包含table-col的所有类 - ##,其中##是0-999之间的整数
  2. 从元素中删除匹配的类,而不删除任何其他类
  3. 所以归结为:如果可能的话,我需要一种方法在$()选择器中使用regexp,然后在每个()中获取所选的类 - 或者将regexp应用于$ .removeClass()。有人能指出我正确的方向吗?

    UPDATE :是否有任何$ .removeClass([selected])功能?这似乎是解决第二部分的最简单方法。

6 个答案:

答案 0 :(得分:19)

如果只有数字可以接受,但也可能有其他字符,我会从这样的事情开始(未经测试,但在评论的帮助下编辑):

$("[class^='table-col-']").removeClass( function() { /* Matches even table-col-row */
     var toReturn = '',
         classes = this.className.split(' ');
     for(var i = 0; i < classes.length; i++ ) {
         if( /table-col-\d{1,3}/.test( classes[i] ) ) { /* Filters */
             toReturn += classes[i] +' ';
         }
     }
     return toReturn ; /* Returns all classes to be removed */
});

答案 1 :(得分:4)

您可以在不需要将类名拆分为数组的情况下执行此操作。让正则表达式完成所有工作。

对于找到的每个元素,删除与正则表达式匹配的所有类。

$("[class^='table-col-']").removeClass( function() {
    return (this.className.match(/\b(table-col-\d{1,3})\b/g) || []).join(' ');
})

答案 2 :(得分:1)

试试这个:

<强> http://jsfiddle.net/adiioo7/AmK4a/1/

JS: -

$(function () {
    $("div").filter(function() {
        return this.className.match(/table-col-\d{0,3}/);
    }).each(function(){
        var classToRemove=this.className.match(/table-col-\d{0,2}/)[0];
        $(this).removeClass(classToRemove);
    });
});

示例HTML: -

<div class="table-col-0 temp">Test0</div>
<div class="table-col-99">Test99</div>
<div class="table-col-999">Test999</div>

输出HTML: -

<div class="temp">Test0</div>
<div class="">Test99</div>
<div class="table-col-999">Test999</div>

答案 3 :(得分:1)

试试这个:

$.fn.removeClassRegExp = function (regexp) {
    if(regexp && (typeof regexp==='string' || typeof regexp==='object')) {
        regexp = typeof regexp === 'string' ? regexp = new RegExp(regexp) : regexp;
        $(this).each(function () {
            $(this).removeClass(function(i,c) { 
                var classes = [];
                $.each(c.split(' '), function(i,c) {
                    if(regexp.test(c)) { classes.push(c); }
                });
                return classes.join(' ');
            });
        });
    }
    return this;
};

直播:http://jsfiddle.net/Z3D6P/

答案 4 :(得分:0)

尝试

var className = 'table-col-';
$('[class^='+className+']').removeClass(function(index, class) {
    return class.indexOf(className) == 0;
});

请参阅http://api.jquery.com/removeClass/http://api.jquery.com/attribute-starts-with-selector/

<强>编辑:

var className = 'table-col-';
$('[class^='+className+']').removeClass(function(index, c) {
    var elem = $(this);
    $(c.split(' ')).each(function() {
        var c = this.trim();
        if(this.indexOf(className)==0) {
            elem.removeClass(c);
        }
    });
});

答案 5 :(得分:0)

这个问题现在已经过时了,但是如果有其他人遇到它......

我创建了一个简单的插件jquery.classMatch,它提供了

$(selector).hasClassMatch(regexp)
$(selector).removeClassMatch(regexp)