2010-12-09 16 views
6

Tengo un acelerador de avance/minimizador/cacher que he escrito en node.js. Funciona bastante bien ahora.RegEx para minimizar CSS

Sin embargo, me pregunto si hay alguna forma de mejorar mi reducción de llamadas regex. Algunos comentarios no están rayados del CSS por completo, y noto algunos otros contratiempos aquí y allá.

Además, considerando mis habilidades con regex, podría hacer lo mismo en la mitad de las llamadas. :)

Cualquier sugerencia será muy apreciada.

Gracias.

function minimizeData(_content) { 
    var content = _content; 
    content = content.replace(/(\/\*.*\*\/)|(\n|\r)+|\t*/g, ''); 
    content = content.replace(/\s{2,}/g, ' '); 
    content = content.replace(/(\s)*:(\s)*/g, ':'); 
    content = content.replace(/(\s)+\./g, ' .'); 
    content = content.replace(/(\s|\n|\r)*\{(\s|\n|\r)*/g, '{'); 
    content = content.replace(/(\s|\n|\r)*\}(\s|\n|\r)*/g, '}'); 
    content = content.replace(/;(\s)+/g, ';'); 
    content = content.replace(/,(\s)+/g, ','); 
    content = content.replace(/(\s)+!/g, '!'); 
    return content; 
} 

Respuesta

8
function minimizeData(_content) { 
    var content = _content; 
    content = content.replace(/\/\*(?:(?!\*\/)[\s\S])*\*\/|[\r\n\t]+/g, ''); 
    // now all comments, newlines and tabs have been removed 
    content = content.replace(/ {2,}/g, ' '); 
    // now there are no more than single adjacent spaces left 
    // now unnecessary: content = content.replace(/(\s)+\./g, ' .'); 
    content = content.replace(/ ([{:}]) /g, '$1'); 
    content = content.replace(/([;,]) /g, '$1'); 
    content = content.replace(/ !/g, '!'); 
    return content; 
} 

debería ser un poco más claro y evita la repetición. Después de la primera sustitución, solo quedarán espacios; después del segundo reemplazo, solo espacios individuales. Esto hace que lo siguiente sea más fácil de reemplazar.

Para explicar la expresión regular comentario de eliminación (que se muestra aquí como una expresión regular detallado puro sin delimitadores):

/\*  # Match /* 
(?:  # Match (any number of times)... 
(?!\*/) # ... as long as we're not right before a */: 
[\s\S] # any character (whitespace or non-whitespace). 
)*  # (End of repeated non-capturing group) 
\*/  # Match */ 
+0

Muchas gracias! – Spot

+0

Gracias, esto lo ha mejorado bastante. Sin embargo, algunos comentarios aún no se están analizando. Una pasta de uno es/* Indicaciones de interacción ---------------------------------- */Pensamientos? – Spot

+0

En realidad, con el contexto: – Spot