Php 通过正则表达式删除没有属性的CSS类
我有这些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.*|)} 但它不会删除前面的类,如您在实时示例中看到的.
.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这就是为什么我在答案中添加了一条注释以使用[^{}]+
我将更新整个模式,谢谢你的注意。