Regex per ridurre al minimo i CSS
-
25-09-2019 - |
Domanda
Ho un avanti stretto aggregatore / Minimizer / cacher ho scritto in node.js. Funziona abbastanza bene ora.
Io sono però chiedo se non v'è alcun modo per migliorare le mie chiamate regex minimizzando. Alcuni commenti non sono a strisce dalla CSS del tutto, e ho notato un paio di altri singhiozzo qua e là.
Inoltre, considerando le mie capacità con regex, potrei essere in grado di fare lo stesso in metà delle chiamate. :)
Qualche suggerimento sarà molto apprezzato.
Grazie.
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;
}
Soluzione
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;
}
dovrebbe essere un po 'più chiara ed evita la ripetizione. Dopo la prima sostituzione, ci saranno spazi lasciati solo; dopo la seconda sostituire, solo spazi singoli. Questo rende le seguenti sostituisce più facile.
Per spiegare l'espressione regolare commento rimozione (qui come una regex verbose puro senza delimitatori):
/\* # 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 */