Php 通过正则表达式删除没有属性的CSS类

Php 通过正则表达式删除没有属性的CSS类,php,regex,Php,Regex,我有这些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.*|)} 但它不会删除前面的类,如您在实时示例中看到的.

我有这些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.*|)}

但它不会删除前面的类,如您在实时示例中看到的
.class-1、


感谢任何解决方案。

从最终模式的注释和积分到@,例如您可以使用的示例数据:

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

  • ^
    字符串的开头
  • (?:
    非捕获组
    • [^{}\r\n]*\r
      匹配除
      {
      }
      或换行符和Unicode换行符序列之外的任何字符的0+倍
  • )*+
    关闭组,并使用
  • [^{}]+
    匹配除
    {
    }
  • {\s*}
    匹配
    {
    }
    ,中间有空格(注意
    \s
    也匹配换行符)
  • \s*
    匹配可能的尾随空格字符

既然您标记了
PHP
,我们可以做一些字符串处理,使正则表达式更简单,只需匹配一个
。一些类{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);

我认为这可能很棘手,但是对于当前的示例,比如
[^{}\r\n]+(?:\r?\n[^{}\r\n]+)*{\s*}
您是否打算使用regex来实现这一点?使用标记器可能更容易。而且,以后可能更容易调试和扩展/更改。@Cully,请您详细解释一下。我正在寻找任何在PHP中可能的解决方案。@user3631047我可以发布它,但看看anubhava的模式,我认为如果这对你也适用的话,这将是更好的答案。@Thefourthbird:
^(?:[^{}\r\n]*\r)*+[^{]+{\s*}\s*
将比我之前发布的更有效。请发布一个答案,因为你是第一个解决这个问题的人。使模式更有效是另一个问题:)@vivek_23这就是为什么我在答案中添加了一条注释以使用
[^{}]+
我将更新整个模式,谢谢你的注意。