1

str_replace を使用して CSS 出力をクリーンアップする作業を行っていますが、開始と終了が定義された特定の文字列ブロックを無視する必要があります。

次で始まるものはすべて無視します。

@media blah(this can be any value) {

無視するコンテンツ:

  .class {
    property: value;
  }

そして次で終わります:

}/*ends*/

代わりに、そのブロックの外側で str_replace を実行します。

.otherclass {property:value;}

PHP:

$output = str_replace("{", "{\n", $output);
$output = str_replace("}", "}\n", $output);

その理由は、@media ブロックには、既に正しくフォーマットされている適切なインデントが必要であり、単純に読み取り可能な行を返す str_replace で触れてはならないからです。

 .otherclass {
  property:value;
  }

それをPHPでなんと言いますか?

ありがとう

4

3 に答える 3

1
$string = 
"@media blah(this can be any value) {
.class {
    property: value;
  }
}/*ends*/

.otherclass {property:value;}

.otherclass {property:value;}

@media blah(this can be any value) {
.class {
    property: value;
  }
}/*ends*/

.otherclass {property:value;}

.otherclass {property:value;}";

$arr = explode("\r", $string);

$ignore_block = false;
for ($i = 0; $i < count($arr); $i++)
{
    if (strstr($arr[$i], '@media'))
        $ignore_block = true;
    elseif (strstr($arr[$i-1], '/*ends*/'))
        $ignore_block = false;

    if ($ignore_block == false)
    {
        $arr[$i] = str_replace("{", "{\n\t", $arr[$i]);
        $arr[$i] = str_replace("}", "\n}\n", $arr[$i]);
    }
}
file_put_contents("test.txt", implode("\n", $arr));

後読みでは可変長が許可されていないため、正規表現は機能しません。ファイルをループしてみてください。

于 2012-04-24T05:51:45.893 に答える
1

また、正規表現の方が柔軟性が高いため、正規表現が適していると思います。

単純な解決策は、最初に出力ソースからすべての出現箇所をフェッチし、次に残りのコードで str_replace を使用してから元に戻すことだと思います。また、コード行を次々と実行し、str_replace のみを実行してみてください。

繰り返しますが、正規表現を使用するのが最善の方法です。あなたが探しているのはpreg_replaceのようで、@mediaが前に続くものと一致しないことを伝えています

参考文献:

于 2012-04-24T04:39:08.593 に答える
1

正規表現はカウントできないため、通常、解析には適していません (これはあなたが行っていることです)。つまり、有効な CSS の完全なセットよりも多くの入力形式を制限できない限り、場合によっては期待どおりに機能しないことがあります。

また、CSS を完全に解析し、ルールを使用して結果の CSS ツリーをたどって、データの出力方法を指定することもできます。どうやらCSSパーサーライブラリがここにあります:

http://www.phpclasses.org/package/1289-PHP-CSS-parser-class.html

于 2012-04-24T05:36:20.447 に答える