2013-03-25 16 views
8

Otrzymałem kilka automatycznie generowanych dokumentów HTML, które mają tysiące linii i muszę oczyścić źródło. Głównie należy usunąć nazwy klas, takie jak "table-col - ##". Jest to problem dwuetapowy:jQuery - regexp wybierając i removeClass()?

  1. Wybierz dowolne i wszystkie klasy, które mają table-kol - ##, gdzie ## oznacza liczbę całkowitą pomiędzy 0-999
  2. Usuń klasę pasujący od elementu, bez usuwanie którykolwiek z pozostałych klas

Więc to sprowadza się do: muszę sposób, jeśli to możliwe, korzystać z wyrażeń regularnych w $() selektorów, a następnie albo do uzyskania wybranej klasy w each() - lub zastosować wyrażenie regularne do $ .removeClass(). Czy ktoś może wskazać mi właściwy kierunek?

AKTUALIZACJA: Czy istnieje jakaś funkcja $ .removeClass ([wybrana])? To wydaje się być najprostszym sposobem rozwiązania drugiej części.

+1

Czy ' "[grupa^= 'tabeli kolumna -']"' zaakceptowania lub też jest ogólnie? –

+0

Niestety zbyt ogólne - istnieją klasy takie jak table-col-new i table-col-bold, które należy zachować. – CodeMoose

+1

po znalezieniu przedmiotów z wybierakiem @Jakub Michálek zasugerował, możesz zrobić .each (function (el) {el.className = el.className.replace (/ table-col- \ d {1,3} /, "") ;}) – Tommi

Odpowiedz

19

jeśli tylko numery są dopuszczalne, ale mogą istnieć inne postacie też, chciałbym zacząć od czegoś w ten sposób (nie testowany, ale edytowany za pomocą komentarzy):

$("[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 */ 
}); 
+0

To jest pierwsza odpowiedź, jaką widziałem w pracy. http://jsfiddle.net/W5ATD/4/ – isherwood

+0

Myślę, że to załatwi sprawę. Dzięki! – CodeMoose

+1

Kod zwrotny można uprościć do 'return this.className.split ('') .filter (function (className) {return className.match (/ table-col- \ d {1,3} /)}). (''); '. Zobacz [Zaktualizowano JSFiddle] (http://jsfiddle.net/W5ATD/9/). – flu

0

spróbować

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

zobaczyć http://api.jquery.com/removeClass/ i http://api.jquery.com/attribute-starts-with-selector/

edycja:

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); 
     } 
    }); 
}); 
+0

Znacznie lepiej niż moje śmieci impl. +1 – karim79

+2

Nice. Ale może lepiej unikać słów zastrzeżonych, takich jak "klasa" – Tommi

+0

Nie widzę, jak to działa. http://jsfiddle.net/W5ATD/1 – isherwood

1

Spróbuj tego:

http://jsfiddle.net/adiioo7/AmK4a/1/

JS: - html

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

Próbka: - HTML

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

wyjściowy: -

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

Spróbuj tego:

$.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; 
}; 

żywo: http://jsfiddle.net/Z3D6P/

+0

ta logika wyróżnia się z tłumu dlatego, że nazywa 'removeClass' tylko jeden raz, zamiast wywoływać' each 'głęboko. –

0

To pytanie jest teraz stary, ale jeśli ktoś inny przychodzi po niej ...

Stworzyłem prostą wtyczkę jquery.classMatch który zapewnia

4

Możesz to zrobić bez potrzeby dzielenia nazw klas na tablice. Niech wyrażenie regularne wykona całą pracę.

Dla każdego znalezionego elementu usuń wszystkie klasy pasujące do wyrażenia regularnego.

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