PHP:替换正则表达式中的CSS属性


PHP: Replace CSS Property in Regex

我正在尝试用Regex解析CSS并替换PHP中的特定值。

目前,我已经能够使用这里找到的"CSS解析器"类解析CSS文件。

我已经能够创建简单的正则表达式,因为我不是太高级,这没有考虑到像间距这样的怪癖。

例子
.marked     p

不会被解析,所以我不得不放弃它。

是否有一个可用的Regex,可以与preg_replace一起使用,可以实现这一点?

此模式查找所有选择器并将规则转换为键值数组。它应该在格式良好的CSS上工作,否则可能需要做一些调整。

的想法是,在CSS中,除了规则括号之间的选择器之外,不会有任何东西。它会搜索字符串,直到出现开始括号,并将其解释为选择器。它基本上搜索"not{"当它找到一个{时它知道它找到了一个选择器。因此,它可能无法正确处理@import s,但这也可以解释。

代码来自我的CSS编译器和解析器,它从Andreas Lagerkvist那里得到了很多想法

function callback($match)
{
    // Normalize whitespace from selector
    $selector = trim(preg_replace('/'s's+/', ' ', $match[1]));
    // Turn the rules into key-value array
    $rules_str = str_replace(array('{', '}'), '', trim(preg_replace('/'s's+/', ' ', $match[2])));
    $rules_pieces = explode(';', $rules_str);
    $rules = array();
    foreach ( $rules_pieces as $rule )
    {
        // No key-value pair?
        if ( ! strstr($rule, ':') ) continue;
        list($key, $value) = explode(':', trim($rule));
        $rules[$key] = trim($value);
    }
    // Do some stuff
    echo $selector . PHP_EOL;
}
$css = "
    body {
            font: foo; size: 1px; 
    }
    #foo .bar div {
            foo: bar;
            foooo: bar;
    }  
    #foo    .bar div { foo: bar; }
";
preg_replace_callback('/([^{;]+)('{[^}]+'})/', 'callback', $css);