REGEX与异常匹配(对于CSS)

时间:2012-07-24 04:15:51

标签: php regex preg-replace

我正在尝试用PHP替换一些CSS样式。

我想在任何.myclass之后的所有#.前面添加, 但不是那些行以background和';'开头最后。

到目前为止,我的正则表达式无效。任何帮助将不胜感激。

这是我的PHP:

$patterns = '/^[^background][,]\s*((#|[.])[^;]+)/m';
$replacements = ', .myclass \1';
$str= preg_replace($patterns,$replacements, $string, -1);

这是最初的CSS:

#class1, #id1, #id2{
    margin:0 0 1.5em 0;
    font-size:2.2em;
    font-family:Century Schoolbook Bold;
}
.class2{
    background:#fff, #111, #ccc;
    font:1.1em;
    font-family:Century Schoolbook;
}

这是所需的CSS:

#class1, .myclass #id1, .myclass #id2{
        margin:0 0 1.5em 0;
        font-size:2.2em;
        font-family:Century Schoolbook Bold;
    }
    .class2{
            background:#fff, #111, #ccc;
        font:1.1em;
        font-family:Century Schoolbook;
    }

3 个答案:

答案 0 :(得分:0)

[blah]是一个字符类,这意味着它将匹配任何这些字母;所以[^ background]表示匹配该单词中的任何字符。同样,您不需要char类来匹配单个字符,例如逗号。

编辑:因为php不支持可变长度的lookbehind,所以遍历每一行,并跳过以background开头的那些:

foreach($lines as $line){
   if(preg_match("/^\s*background.+\;$/",$line) == 0)
   {
      array_push($new, preg_replace("/,\s+#/",", .myclass ",$line));
   }
   else
   {
      array_push($new,$line);
   }
}

或类似。

答案 1 :(得分:0)

我想用一个正则表达式解决你的任务是不可能的。 您需要可变长度的后视断言来解决它并且它们没有实现。 但如果是,那么解决方案就像:

/(?<!background:.*)(#[a-zA-Z_0-9]*)/

这里的问题是(?<!background:.*)。你说.*,这意味着这个断言可以有任何长度。它将继续工作。

更简单的解决方案是将任务分成两部分。

  1. 检查内部background的行。
  2. 如果没有background,请运行preg_replace

答案 2 :(得分:0)

“仅在逗号” - &gt;之后,在“#”和“,”之前添加.myclass所以你想在.myclass,之间添加#

即。每当您看到, #时,您希望它是, .myclass #

我猜你只想影响定义CSS类的行(这就是你排除background: ...的原因)。

在这种情况下,我建议采用以下标准:

“每当您看到,[space]#时,只有当发生这种情况的行, .myclass #结尾时才会将其转为{ STRONG>“。 (或者“只有当发生这种情况的行不以;”结束时才会出现。)

这依赖于这样一个事实:当您创建CSS选择器时,您使用{结束这一行,这些是您希望影响的唯一行。

然后我建议替换正则表达式:

/, *#(?=.+\{ *$)/m

with:

', .myclass #'

这是如何运作的:

, *#    : "find a comma followed by 0 or more spaces and then a hash symbol,
(?=     : FOLLOWED BY:
  .+    : the rest of the line PLUS
  \{ *$): an opening curly bracket at the end of the line (possibly spaces between this and the end of the line)

/m表示如果$string包含新行,则$匹配行的结尾(而不是整个字符串$string的结尾)。< / p>

在微调正则表达式方面,有一个游戏here(即验证你的正则表达式是首先然后在PHP中试用它,所以,如果你有任何问题,你会知道它是一个正则表达式问题还是一个PHP问题。)