Удалить CSS-селекторы и связанные с ними свойства, если это необходимо - PullRequest
2 голосов
/ 04 мая 2011

Я пытаюсь удалить определенные селекторы CSS, и если для списка свойств больше нет селекторов, чем сценарий удаляет его ...

Мне удалось заставить работать часть скрипта:http://jsfiddle.net/jnbdz/MarRr/5/

Вот код:

$$('button')[0].addEvent('click', function(){

var css = document.id('css').get('text');

var newCss = css.replace(/(\n|\r|\s\s)/g, "")
.replace(/(,\s*body\s*(?={)|,\s*body\s*(?=,)|body\s*,|,\s*head\s*(?={)|,\s*head\s*(?=,)|head\s*,)/gi, "")
.replace(/(body\s*(?={)|head\s*(?={))/gi, "")
.replace(/(^\{[^}]*?\}|\}\s*\{[^}]*?\})/gim, "");

document.id('cleancss').set('text', newCss);

});

Проблема в том, что, если я удаляю разрывы строк, сценарий, который я написал, не сможет удалить свойства, не связанные с какими-либоселекторы ...

Если я сохраняю разрывы строк, это работает ...

Кроме того, я хотел бы узнать от кодеров, которые хороши с ReGex, если мой код хорош ...

Заранее большое спасибо за любую помощь.

1 Ответ

1 голос
/ 31 мая 2011

В последней замене вы используете многострочный флаг. Это не может работать, если у вас есть только одна строка, которую вы делаете после первой замены. Так что давайте сначала оставим разрывы строк и удалим их после удаления селекторов.

Вы также можете немного упростить регулярные выражения. Используйте x(?=a|b) вместо x(?=a)|x(?=b). Вам также не нужен ленивый матч [^\}]*?.

Ниже приведен рабочий пример. Для ясности я только убрал селектор body.

$$('button')[0].addEvent('click', function(){

    var css = document.id('css').get('text');

    var newCss = css
        // replace multiple tabs or spaces by one
        .replace(/( |\t)+/g, " ")
        // remove space at beginning of line
        .replace(/(^\s)/gm, "")
        // remove body in selector lists
        .replace(/(,\s*body\s*(?={|,)|body\s*,)/gi, "")
        // remove body before {
        .replace(/(body\s*(?={))/gi, "")
        // remove rules without selector
        .replace(/[\n\r]+\{[^\}]*\}/g, "")
        // remove linebreaks
        .replace(/[\n\r]+/g, "");

    document.id('cleancss').set('text', newCss);

});

Вы можете дополнительно сжать таблицу стилей, удалив пробелы перед { или после : и ,

...