正则表达式 - 从内到外替换

时间:2012-09-18 16:14:00

标签: php css regex preg-match stylesheet

所以我正在为样式表构建解析器。在我的CSS文件中,我将解析类似这样的内容:

body {
   background-image: &gradient(#1073b8, &saturate(#1073b8, -20), 40);
}

结果将是这样的值:

body {
   background-image: url(/cache/graident12345.png);
}

我的&gradient()函数的输出是我捕获并执行的。但是&gradient()的一个论点是&saturate()的结果,所以它是分层的,我需要preg_replace()来处理它们从内到外,但我该怎么做呢?因此,首先捕获并解析&saturate(),返回一个颜色HEX值,该值在解析&gradient()时将在字符串中。我当前的查找代码如下所示:

if (preg_match("/\&(gradient|saturate)\((.*?)\)/", $value, $m)){
   $arg = explode(", ", $m[2]); # splits argument to the function
   if ($m[1] == "saturate"){
       $value = str_replace($m[0], saturate($arg[1], $arg[2]);
   }
}

我会添加功能,因为我可以使用它们。或者,也可以在正则表达式中捕获函数名称。

我能说清楚吗?有任何想法吗? :)

1 个答案:

答案 0 :(得分:0)

您可以使用regex结合递归函数进行一些有趣的解析。我已经嘲笑了一些适用于你的场景的东西,可以根据你的需要进行调整。

http://ideone.com/66tV0

如果您需要对正在发生的事情做任何解释,请告诉我,但它基本上通过递归调用函数来创建递归结构,该函数为模式&functionname([args...])的正则表达式。