Удалить классы CSS без свойств с помощью регулярного выражения - PullRequest
1 голос
/ 27 января 2020

У меня есть эти CSS коды.

.class-1,
.class-2,
class-3 {
    }
.class-4,
class-5 {
}
.class-6,
class-7 {}
.not-empty-1 {font-size: 12;}
.not-empty-2 {
    font-size: 12;
}
.not-empty-3 {
font-size: 12;
}

Мне нужно удалить классы CSS, которые не имеют никаких свойств.

Я пробовал это

.+\s{(\n.*|)}

https://regex101.com/r/8xFUDl/2

, но он не удаляет предыдущие классы, такие как .class-1, .class-2,, как вы видите в живом примере.

Любое решение приветствуется .

Ответы [ 2 ]

1 голос
/ 27 января 2020

От комментариев и кредитов для окончательного шаблона до @ анубхава , для примера данных, которые вы можете использовать:

^(?:[^{}\r\n]*\R)*+[^{}]+{\s*}\s*

Объяснение

  • ^ Начало строки
  • (?: Группа без захвата
    • [^{}\r\n]*\R Совпадение 0+ раз с любым символом, кроме { } или новой строки и Unicode последовательность новой строки
  • )*+ Закрыть группу и повторить 0+ раз, используя собственнический квантификатор
  • [^{}]+ Совпадение 1+ раз с любым другим символом чем { или }
  • {\s*} Соответствует { и } с пробелами между ними (обратите внимание, что \s также соответствует символу новой строки)
  • \s* Соответствует Возможные конечные пробельные символы

Regex demo

0 голосов
/ 27 января 2020

Поскольку вы пометили PHP, мы можем немного обработать строку, чтобы упростить регулярное выражение, где мы можем просто сопоставить один стиль .some_class{some_props} и игнорировать всех остальных, кто не следует этому свойству.

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

Фрагмент:

<?php

$str = '.class-1,
.class-2,
class-3 {
    }
.class-4,
class-5 {
}
.class-6,
class-7 {}
.not-empty-1 {font-size: 12;}
.not-empty-2 {
    font-size: 12;
}
.not-empty-3 {
font-size: 12;margin-top:25px;
}';

$new_str = '';

for($i=0;$i<strlen($str);++$i){
    if(strlen(trim($str[$i])) === 0) continue; // skip new lines,spaces, line feeds etc
    $new_str .= $str[$i];
    if($str[$i] == '}') $new_str .= ' ';
}

$results = [];

foreach(explode(" ",$new_str) as $css_style){
    if(preg_match('/^(.+?)\{(.+?)\}$/',$css_style,$matches)){
        $results[] = implode("\n",[$matches[1],"{\n ".$matches[2]."\n}"]);
    }
}


echo implode("\n\n",$results);

Демонстрация: https://3v4l.org/67mXE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...