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

时间:2020-01-27 07:50:26

标签: 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.*|)}

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

,但是它不会删除如在实时示例中看到的先前的类,例如.class-1, .class-2,

任何解决方案都值得赞赏。

2 个答案:

答案 0 :(得分:1)

从最终模式的注释和字幕到@ anubhava,对于示例数据,您可以使用:

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

说明

  • ^字符串的开头
  • (?:非捕获组
    • [^{}\r\n]*\R匹配0+次除{ }或换行符和Unicode换行符序列以外的任何字符
  • )*+关闭组并使用possessive quantifier
  • 重复0次以上
  • [^{}]+匹配除{}以外的任意其他字符1倍以上
  • {\s*}{}匹配,中间留有空格(请注意\s也与换行符匹配)
  • \s*匹配可能的尾随空白字符

Regex demo

答案 1 :(得分:0)

自从您标记了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

相关问题