我有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;}
答案 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 }}