如何使RegEx匹配CSS的非贪婪部分匹配


how to make RegEx to match CSS non greedy for a part of the match

我正在研究这个RegEx,以便用其他CSS值匹配和替换CSS。到目前为止,我有这个:

$css_new = preg_replace('/('.$definition.'.*?'s'.$property.':)[^;]*([^}]*)/is','$1 '.$value.'$2',$css_temp);

我遇到的问题是,如果我试图替换定义".menu"中的某些内容,则".menu-li"定义中的值也会被替换。

我想在某个地方加一个"{",但我运气不好。我试过这个:

$css_new = preg_replace('/('.$definition.'{.*?'s'.$property.':)[^;]*([^}]*)/is','$1 '.$value.'$2',$css_temp);

谢谢你的帮助。

我假设$definition总是包含整个选择器。(请注意,在将点添加到正则表达式之前,您需要替换定义中的点,否则.menu也将与smenu匹配)

$definition = '.submenu';
// no match:
.menu .submenu

我还假设CSS不是完全干净的(所以可能会出现双空格等)

.menu    .submenu {

下一个假设是不存在多个(逗号)分隔的CSS规则(否则您将更改多个规则):

.menu .submenu, .menu .list {

然后这应该工作:(未完全测试)

$cleanDefinition = str_replace(array('.', ' '), array(''.', ''s+'), $definition);
$result = preg_replace('/((?:}|^)'s*'.$cleanDefinition.''s*{.*'.$property.''s*:)(.+?)(;.*?})/is', '$1'.$value.'$3', $css_temp);

我只是想报告一下我是如何解决这个问题的。我能够提出这条线,并对其进行了广泛的测试。

$css_new = preg_replace('/(.*^'.$definition.''s{.*?'s'.$property.':)[^;]*([^}]*)/ism','$1 '.$value.'$2',$css_temp);

如果你看到这行有什么问题,请告诉我,但我相信这解决了问题。