0

一部の CSS スタイルを PHP に置き換えようとしています。

.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

あなたのタスクを 1 つの正規表現で解決することは不可能だと思います。それを解決するには可変長の後読みアサーションが必要ですが、それらは実装されていません。しかし、そうであれば、解決策は次のようになります。

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

ここでの問題は(?<!background:.*). あなたが言う.*には、それはこのアサーションが任意の長さを持つことができることを意味します。そして、それはもううまくいくでしょう。

より簡単な解決策は、タスクを 2 つの部分に分割することです。

  1. background内側のラインをチェック。
  2. がない場合はbackground、実行しpreg_replaceます。
于 2012-07-24T04:36:37.870 に答える
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

.myclass'#' と ',' の前にカンマの後にのみ追加する」 -->と?.myclassの間に追加する必要があります。,#

つまり、, #あなたがそれになりたいと思うときはいつでも, .myclass #

そして、CSS クラスを定義する行にのみ影響を与えたいと思います (これが を除外する理由です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ている場合、(文字列全体の末尾ではなく) 行の末尾に一致することを意味します。$string$$string

正規表現の微調整に関しては、ここで試してみてください (つまり、最初に正規表現が機能することを確認してから、PHP で試してみてください。問題が発生した場合は、それが正規表現の問題なのか PHP の問題なのかがわかります)。

于 2012-07-24T04:56:17.587 に答える