php正则表达式选择较少的代码

问题描述 投票:0回答:1

我想从文件中选择所有较少的代码。但我找不到正确的方法来做到这一点。

到目前为止这是我的代码

$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个其他}。

我该如何解决?

php regex less
1个回答
0
投票

看起来你想匹配各个块,所以递归模式将返回平衡括号。正如问题评论中所述,当角色异常发生时,此方法可能会中断。我相信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)|[^}])*}~

但那取决于你的实际输入。

© www.soinside.com 2019 - 2024. All rights reserved.