0

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

3 回答 3

0

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

编辑:由于 php 不支持可变长度后视,循环遍历每一行,并跳过以背景开头的那些:

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

或类似的。

于 2012-07-24T04:28:44.253 回答
0

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

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

这里的问题在于(?<!background:.*). 你说.*,这意味着这个断言可以有任意长度。它将不再起作用。

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

  1. 检查background内部的线路。
  2. 如果没有background,运行preg_replace
于 2012-07-24T04:36:37.870 回答
0

.myclass在 '#' 和 ',' 前面添加,仅在逗号之后” --> 所以你想.myclass,and之间添加#

即每当你看到, #你想要它是, .myclass #

而且我猜您只想影响定义 CSS 类的行(这就是您 exclude 的原因background: ...)。

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

“每当您看到,[space]#时,, .myclass # 仅当发生这种情况的行以 .结尾{时才将其转为。” (或者也许“仅当发生这种情况的行不以;”结尾时)。

这取决于这样一个事实,即当您制作 CSS 选择器时,您会以 a 结束行,{而这些是您希望影响的唯一行。

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

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

和 :

', .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意味着 if$string包含新行,$匹配行的结尾(而不是整个字符串的结尾$string)。

在微调正则表达式方面,在这里玩一下(即验证您的正则表达式是否有效,然后在 PHP 中尝试,这样如果您有任何问题,您就会知道是正则表达式问题还是 PHP 问题)。

于 2012-07-24T04:56:17.587 回答