RegEx для минимизации CSS - PullRequest
       7

RegEx для минимизации CSS

6 голосов
/ 09 декабря 2010

У меня есть прямой прямой агрегатор / минимизатор / кэширующий, который я написал в node.js. Это работает довольно хорошо сейчас.

Мне, однако, интересно, есть ли способ улучшить мои минимизирующие вызовы регулярных выражений. Некоторые комментарии не полностью отделены от CSS, и я заметил некоторые иные ошибки здесь и там.

Кроме того, учитывая мои способности с регулярным выражением, я мог бы сделать то же самое в половине вызовов. :)

Любые предложения будут с благодарностью.

Спасибо.

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

1 Ответ

8 голосов
/ 10 декабря 2010
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;
}

должно быть немного понятнее и избегать повторений. После первой замены останутся только пробелы; после второй замены только одиночные пробелы. Это облегчает следующую замену.

Чтобы объяснить регулярное выражение для удаления комментариев (показано здесь как чистое подробное регулярное выражение без разделителей):

/\*       # 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 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...