我想从文件中选择所有较少的代码。但我找不到正确的方法来做到这一点。
到目前为止这是我的代码
$d = <<<EOT
.class {
width:100%;
height:100%;
background-image: url(images/fallback-gradient.png);
}
.id {
b:100%;
bc: url(images/fallback-gradient.png);
}
& when ( @main_container_top_option = true) {
.fast_menu_option {
.gpicon {
color: transparent;
}
}
}
EOT;
$pattern = '/.*\{(?s:.*?)\}$/mi';
$t = preg_match_all($pattern, $d, $out, PREG_PATTERN_ORDER);
foreach ($out[0] as $key) {
echo '<br><pre>'.$key."</pre>";
}
这就是结果:
.class {
width:100%;
height:100%;
background-image: url(images/fallback-gradient.png);
}
.id {
b:100%;
bc: url(images/fallback-gradient.png);
}
& when ( @main_container_top_option = true) {
.fast_menu_option {
.gpicon {
color: transparent;
}
对于前两个类是好的,但最后一个是不好的,因为他们缺少2个其他}。
我该如何解决?
看起来你想匹配各个块,所以递归模式将返回平衡括号。正如问题评论中所述,当角色异常发生时,此方法可能会中断。我相信css解析器“在野外”,但我没有任何建议。
代码:(Demo)
if (preg_match_all('~.*\{((?R)|[^}])*}~', $d, $out)) {
echo implode("\n---\n",$out[0]);
}
输出:
.class {
width:100%;
height:100%;
background-image: url(images/fallback-gradient.png);
}
---
.id {
b:100%;
bc: url(images/fallback-gradient.png);
}
---
& when ( @main_container_top_option = true) {
.fast_menu_option {
.gpicon {
color: transparent;
}
}
}
如果您不需要分隔块,可以像这样修改模式:
~[^{]*\{((?R)|[^}])*}~
但那取决于你的实际输入。