Поскольку вы пометили 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