2013-03-25 15 views
8

Ho ricevuto diversi documenti HTML generati automaticamente con migliaia di righe e ho bisogno di ripulire il codice sorgente. Principalmente è necessario rimuovere nomi di classi come "table-col - ##". Questo è un problema in due fasi:jQuery - regexp selezionando e removeClass()?

  1. Selezionare eventuali e tutte le classi che hanno tavolo-col - ##, dove ## è un numero intero tra 0-999
  2. Rimuovere la classe corrispondente dall'elemento senza rimozione di qualsiasi delle altre classi

Così tutto si riduce a: ho bisogno di un modo, se possibile, di utilizzare espressioni regolari in $() selettori, e poi o per ottenere la classe selezionata in ciascuno() - o applicare il regexp a $ .removeClass(). Qualcuno può indicarmi la giusta direzione?

UPDATE: Esiste qualche tipo di funzionalità $ .removeClass ([selezionata])? Sembra il modo più semplice per risolvere la seconda parte.

+1

Sarebbe ' "[class =^'table-col -']"' essere accettabile o è che troppo generico? –

+0

Sfortunatamente troppo generico: ci sono classi come table-col-new e table-col-bold che devono essere preservate. – CodeMoose

+1

dopo aver trovato gli elementi con il selettore @Jakub Michálek suggerito, puoi fare .each (function (el) {el.className = el.className.replace (/ table-col- \ d {1,3} /, "") ;}) – Tommi

risposta

19

Se solo i numeri sono accettabili, ma ci possono essere altri personaggi troppo, vorrei iniziare con qualcosa di come questo (non testato, ma modificato con l'aiuto dei commenti):

$("[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

Questa è la prima risposta che ho visto funzionare. http://jsfiddle.net/W5ATD/4/ – isherwood

+0

Penso che questo farà il trucco. Grazie! – CodeMoose

+1

Il codice di callback può essere semplificato per restituire this.className.split ('') .filter (function (className) {return className.match (/ table-col- \ d {1,3} /)}). Join (''); '. Vedi [Aggiornamento JSFiddle] (http://jsfiddle.net/W5ATD/9/). – flu

0

provare

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

vedere http://api.jquery.com/removeClass/ e http://api.jquery.com/attribute-starts-with-selector/

modificati:

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

Molto meglio della mia impl di immondizia. +1 – karim79

+2

Bello. Ma forse è meglio evitare parole riservate come "classe" – Tommi

+0

Non vedo come funziona. http://jsfiddle.net/W5ATD/1 – isherwood

1

Prova questo fuori:

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

campione: -

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

Output HTML: -

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

Prova questo:

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

dal vivo: http://jsfiddle.net/Z3D6P/

+0

questa logica si distingue dalla folla perché chiama 'removeClass' solo una volta, piuttosto che chiama' each' in profondità. –

0

Questa domanda è ormai vecchio, ma se qualcun altro si imbatte in essa ...

ho creato un semplice plugin jquery.classMatch che fornisce

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

È possibile eseguire questa operazione senza la necessità di dividere i nomi di classe in una matrice. Lascia che l'espressione regolare faccia tutto il lavoro.

Per ogni elemento trovato, rimuovere tutte le classi che corrispondono all'espressione regolare.

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

Problemi correlati