需要正则表达式来解析代码

时间:2014-01-08 19:02:13

标签: php parsing expression

我有css文件,需要像

那样削减风格
#x{ a:b;c:d;}

这很好,但有像

这样的风格
@media pla pla {
  #x{ a:b;c:d;}
  #x{ a:b;c:d;}
  #x{ a:b;c:d;}
}

这种风格我不知道我是怎么写正则表达式的,我需要像这样的结果

$x(0) = @media pla pla
$(1) =#x{ a:b;c:d;}
      #x{ a:b;c:d;}
      #x{ a:b;c:d;}

1 个答案:

答案 0 :(得分:2)

尝试使用扩展的正则表达式,recursive pattern更多的兴趣和实践:)

$code = '

#x{ a:b;c:d;}

@media pla pla {
  #x{ a:b;c:d;}
  #x{ a:b;c:d;}
  #x{ a:b;c:d;}
}

#z{ a:b;c:d;}';

// --------------------------

// remove comments first, if there are
#$code = preg_replace('~/\*.*?\*/~s', "", $code);

// try it with a recursive pattern
$recursive_pattern = '~(?:^|\n)\s*\K[^\s{][^{]*?\s*{(?:[^{}]+|(?R))*}~';

$result = array();
if(preg_match_all($recursive_pattern, $code, $out))
{
  foreach($out[0] AS $k => $v)
  {
    // break into -> start { inner }
    if(preg_match('~^([^{]+?)\s*{\s*(.*?)\s*}\s*$~s', $v, $out2))
    {
      // set inner -> trim/expand spaces
      $result[$out2[1]] = ltrim(preg_replace(

          //    |start sp |newline   |;} -> ; }       | 2+ spaces -> 1
          array('~^ +~m', '~\r?\n~', '~;(?=[^\s])~m', '~\s{2,}~'),
          array("",       " ",       "; ",            " "),
          $out2[2]));
    }
  }
}

// check output
echo "<pre>"; var_export($result); echo "</pre>";

输出

array (
  '#x' => 'a:b; c:d;',
  '@media pla pla' => '#x{ a:b; c:d; } #x{ a:b; c:d; } #x{ a:b; c:d; }',
  '#z' => 'a:b; c:d;',
)

简短说明

  • (?:^|\n)字符串开头或换行符
  • \s*任意数量的空格
  • \K重置比赛开始
  • [^\s{][^{]*?一个字符,没有空格或{后跟少数任何不是{
  • \s*后跟任意数量的空格
  • \{(?:[^{}]+|(?R))*}递归部分:匹配{后跟任意数量的字符,这些字符不是{}(R)从整个事物开始...... {{1 }}