我正在尝试用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);