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

时间:2018-02-28 10:27:54

标签: php regex less

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

这是我目前的代码

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

我该如何解决?

1 个答案:

答案 0 :(得分: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)|[^}])*}~

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